javascript - 设置后无法设置标题

标签 javascript node.js mongodb neo4j

我试图获取保存在我的 neo4j 数据库中的 idsFromMongo,并在 mongodb 中搜索这些 ID 以返回我想要的对象。它工作了 1 次,但随后我的服务器崩溃了,并返回错误消息发送后无法设置 header 。

这是我的代码:。

routes.get('/advertisements/recommended/:brand', function(req, res) {
  res.contentType('application/json');

  var brandFromUrl = req.params.brand;
  var advertisementIds = [];

  Advertisement.find({'car.brand': brandFromUrl})
    .then(function (ads) {
      // res.status(200).json(ads);
      ads.forEach(function (record) {
        console.log('ids: ' + record._id)
        session
          .run("MERGE(a:Advertisement {idFromMongo: {idParam}, brand: {brandParam}}) WITH a MATCH(b: Advertisement {brand: {brandParam}}) MERGE(a)-[:SHARED_BRAND]->(b)", {idParam: record._id.toString(), brandParam: brandFromUrl})
          .then(function(result) {
            session
              .run("MATCH (n:Advertisement{brand: {brandParam}}) RETURN (n)", {brandParam: brandFromUrl})
              .then(function(result) {
                result.records.forEach(function(record){
                  advertisementIds.push(record._fields[0].properties.idFromMongo);
                });
                Advertisement.find({
                  '_id': { $in: advertisementIds}
                }, function(err, docs){
                  res.status(200).json(docs);
                })
            })
        })
      });
    })
    .catch((error) => {
      res.status(400).json(error);
    });
});

这是我的错误:

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:494:11)
    at ServerResponse.setHeader (_http_outgoing.js:501:3)
    at ServerResponse.header (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (c:\dev\individueel-project\individueel-database\node_modules\express\lib\response.js:267:15)
    at c:\dev\individueel-project\individueel-database\api\advertisement.routes.v1.js:70:35
    at model.Query.<anonymous> (c:\dev\individueel-project\individueel-database\node_modules\mongoose\lib\model.js:4046:16)
    at c:\dev\individueel-project\individueel-database\node_modules\kareem\index.js:273:21
    at c:\dev\individueel-project\individueel-database\node_modules\kareem\index.js:131:16
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

最佳答案

这里的问题是您正在执行一个数组并将响应发送到数组中。因此,最终它会多次发送响应,但只有第一次会起作用,之后会引发错误。 要解决它,您应该在数组中的所有 promise 完成(Promise.all)后回答请求,或者如果您不需要等到整个数组完成,请检查您是否已经响应并且不这样做再次。

关于javascript - 设置后无法设置标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47866731/

相关文章:

javascript - 尝试删除时,React 列表会删除错误的项目

javascript - CSS 在基于 URL 上工作,但不在网站的其他页面上工作。代码点火器

node.js - 如何在node.js中应用后重定向和获取模式?

javascript - 从网络请求中回答

javascript - 无法从 mongo 数据库中选择多行

javascript - 发送带有 href 标签的邮件

javascript - 使用 .reduce() 创建一个包含前一个数组中所有相似键值的新数组

javascript - NodeJS (JavaScript) - 转换日期最快的方法?

node.js - Mongoose 将值推送到数组内的数组中

javascript - NodeJS 和 mongo : insertMany changing value from data in the callback function