【问题标题】:Express with Q deferred not responding to requests带有 Q 的 Express 延迟不响应请求
【发布时间】:2016-11-22 13:17:29
【问题描述】:

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

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);

【问题讨论】:

  • deferred.resolve(text) 在您的节点文件中?!然后return deferred.promise;
  • @IsmailRBOUH 我的错误,这是一个糟糕的复制粘贴。这就是目前所拥有的。
  • 但是你还需要解决你的延期deferred.resolve(text)
  • 网络检查器显示什么?我敢打赌这是服务器端的问题,与角度无关。
  • @Bergi 终端或控制台中没有错误错误。文件的内容是在终端打印的,所以我认为服务器端没有任何错误。

标签: javascript node.js express promise q


【解决方案1】:

Express 不支持开箱即用的承诺。从处理程序返回一个承诺对它没有任何意义。你仍然需要明确地调用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");
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2012-12-02
    相关资源
    最近更新 更多