用Q deferred 表示不响应请求

Express with Q deferred not responding to requests

我正在尝试将节点后端与我的 angular 脚本一起使用,使用 Q 来 promise-fy 一个 fs 方法。使用正常的回调方法是可行的,但是在这里,Angular 没有返回任何内容。控制台什么都不打印,控制台和node为运行的终端也没有返回错误。我错过了什么?

var express = require('express');
var app = express();
var router = express.Router();
var FS = require('fs');
var Q = require('q');

app.use('/bower_components', express.static(__dirname + '/bower_components'));
app.use('/dist', express.static(__dirname + '/dist'));

app.get('/', function(req, res) {
    res.sendfile('./index.html');
});

app.get('/test', function(req, res){
    // res.send('asdf')
    var deferred = Q.defer();
    FS.readFile("gulpfile.js", "utf-8", function (error, text) {
        console.log('error', error);
        console.log('in read file')
        if (error) {
            deferred.reject(new Error(error));
        } else {
            res.send(text);
            deferred.resolve(text);
        }
    });
    return deferred.promise;
});

app.listen(5000);

Express 不支持开箱即用的 promise。从处理程序返回一个承诺对它来说没有任何意义。您仍然必须显式调用 res.send(尽管有 modules such a express-promise 可以缓解这种情况)。

您的代码应如下所示:

app.get('/test', function(req, res){
    var promise = Q.ninvoke(FS, "readFile", "gulpfile.js", "utf-8");
    promise.then(function (text) {
        res.status(200).send(text);
    }, function(error) {
        console.error(error);
        res.status(500).send("oops");
    });
});