【问题标题】:ExpressJS / Mongoose res.send() doesn't workExpressJS / Mongoose res.send() 不起作用
【发布时间】:2014-10-20 12:27:27
【问题描述】:

我之前有多个回调,然后我想做一个 res.send() 来构建 JSON API:

app.get('/api', function (req, res){
...
        function logPagesId() {
            console.log("load: " +pagesId);
            console.log("lenght: " +pagesId.length);
            findWords(logWords);
        }

        function logWords() {
           console.log("TAGS: "+wordsArray);
           return res.send(wordsArray);
        }

    findIdPages(logPagesId);
}

在日志中,我有:

Successfully connected to MongoDB
load: 45678bdhbdns768,45678bdhbdns765
lenght: 2
TAGS:
{ _id: 45678bdhbdns765,
  result:
   { ID1: { Pages: [Object], Name: [Object] },
     ID2: { Pages: [Object], Name: [Object] },
    .... 

最后返回[]。

[编辑]

[完整代码]

app.get('/tags/reference/:reference', function (req, res){
    var articlesId = [];
    var tagsArray = [];
  function findIdArticles(callback) {
      Articles.find({reference: req.params.reference}, '_id' , function (err, articles) {
      if (!err) {
        for (var i = 0; i < articles.length; i++) {
            articlesId.push(articles[i]._id);
        }
        for (i=0 ; i < articlesId.length; i++){
            Extract_Tags.findById(articlesId[i], function (err, tags) {
            if (!err) {
                tagsArray.push(tags);
                console.log(tags);
                callback(null, tagsArray);
            } else {
                callback(err);
            }
            });
        }

    } else {
      callback(err);
    }
    });
  }

     function logArticlesId(err, response) {
        res.status(503).send('fancy server side error message!');
        console.log("load: " +articlesId);
        console.log("tagsArray: " +tagsArray);
        console.log("response: " +response);
        logTags(response);
     }

    function logTags(response) {
        console.log("TAGS: "+response);
        res.send(response);

    }

findIdArticles(logArticlesId);
});

这里是包含一些更改的完整代码。只是有错误花哨的服务器端错误消息! 感谢您的帮助

【问题讨论】:

  • 什么不能按预期工作?您尝试过什么来解决此问题?你用的是什么版本的快递?抛出的错误是什么?这么多的问题,这么少的信息。 -1
  • 它应该返回一个 JSON,但它返回一个空数组 []。如果我做一些简单的事情, res.send() 就可以了。但是当我在函数中使用函数时,我认为有些地方是错误的。
  • 你搞砸了。您的 findIdPages 函数在哪里?它的作用是什么?
  • 如果你想发回 JSON,你应该使用res.json()
  • @Jarema findIdPages 只是返回一个带有回调的值。问题是我可以看到要显示为 API 的数据(在日志中)。

标签: javascript node.js mongodb express


【解决方案1】:

首先,你的回调函数应该总是返回——即使有错误。否则永远不会调用你在错误场景中的回调函数!

所以,对于 findIdArticles()

function findIdArticles(callback) {
      Articles.find({folder: req.params.folder}, '_id' , function (err, articles) {
      if (!err) {
      for (var i = 0; i < articles.length; i++) {
        pagesId.push(pages[i]._id);
       }
        callback(null, pagesId);
    } else {
        callback(err);
    }
    });
  }

其次,你打电话给findIdPages,你向我们展示了findIdArticles

解决这些错误后,您的app.get 应该如下所示:

app.get('/api', function (req, res){
...
        function logPagesId(err, response) {
            // deal with errors, for ie:
             if (err) {
                res.status(503).send('fancy server side error message!');
                return;
            }


            console.log("load: " +response);
            console.log("lenght: " +response.length);
            findWords(response);
        }

        function logWords() {
           console.log("TAGS: "+wordsArray);
           return res.send(wordsArray);
        }

    findIdPages(logPagesId);
}

但它仍然无济于事,因为您从不在这里调用 logWords。我猜它在 findWords 中,需要类似的工作。我对现有功能所做的。

编辑我的回答有误。请立即检查。

【讨论】:

  • 感谢您的帮助。刚刚用您的更改编辑了代码,但仍然有错误。谢谢!
  • 这行:console.log("TAGS:"+response);输出正确的数据?
  • 是的,我得到了响应数据。但是它不起作用 res.send(response);我认为这是因为 for (i=0 ; i
  • 我有以下错误 http.js:689 throw new Error('Can\'t set headers after they are sent.'); ^ 错误:发送后无法设置标题。在 ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
  • 我的代码中有错误(res.status(502) 总是发送,不仅发生错误)。请重新检查:)
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2012-09-12
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多