【问题标题】:Error "can't set headers after they are sent"错误“发送后无法设置标头”
【发布时间】:2018-06-29 13:33:32
【问题描述】:

我正在尝试编写一个 node.js 应用程序来使用 omdb api 获取电影列表。 当我尝试请求 /result 路由时,我收到以下错误:

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 (/home/cabox/workspace/APIs/movie_search_app/node_modules/express/lib/response.js:767:10)
    at ServerResponse.contentType (/home/cabox/workspace/APIs/movie_search_app/node_modules/express/lib/response.js:595:15)
    at ServerResponse.send (/home/cabox/workspace/APIs/movie_search_app/node_modules/express/lib/response.js:145:14)
    at Request._callback (/home/cabox/workspace/APIs/movie_search_app/app.js:18:13)
    at Request.self.callback (/home/cabox/workspace/APIs/movie_search_app/node_modules/request/request.js:186:22)
    at emitTwo (events.js:126:13)
    at Request.emit (events.js:214:7)
    at Request.<anonymous> (/home/cabox/workspace/APIs/movie_search_app/node_modules/request/request.js:1163:10)

我的 app.js 文件中的完整代码如下:

var express = require("express");
var app = express();

var request = require("request");

app.set("view engine", "ejs")

app.get("/", function(req, res){
    res.send("Hello, it workds! ... and this is the home page");
});


app.get("/results", function(req, res){
    res.send("Hello, it workds!");

    request("http://omdbapi.com/?s=california&apikey=thewdb", function(error, response, body){     
      if (!error && response.statusCode ==200) {      
        var data = JSON.parse(body);
        res.send(results.search(0).title);
        res.render("results", {data: data});
      }  
    });

});


app.listen(3000,function(){
  console.log("Movie App has started!!!");
});

真诚地希望有人可以帮助提供一些有关如何处理/解决此错误的指导。

【问题讨论】:

标签: javascript node.js api express request


【解决方案1】:

您已经发送了一个字符串作为响应,并稍后尝试将呈现的页面也发送到客户端,这不起作用...

app.get("/results", function(req, res){
  [...]     
  if (!error && response.statusCode ==200) {      
    [...]
    // HERE IS YOUR PROBLEM
    res.send(results.search(0).title);
    res.render("results", {data: data});
  }  
});

What does "res.render" do, and what does the html file look like?

http://expressjs.com/en/api.html

【讨论】:

    【解决方案2】:

    @moneydhaze 感谢您的回复。你让我彻底浏览了代码并简单地启动。看来 res.send 和 res.render 是冲突的。当我取出 res.render 并简化代码时;有效。请参阅下面的简化代码:

    var express = require("express");
    var app = express();
    
    var request = require("request");
    
    app.set("view engine", "ejs")
    
    
    app.get("/", function(req, res){
      res.send("This is the Home Page")
    });
    
    
    app.get("/results", function(req, res){
        request("http://www.omdbapi.com/?s=guardians+of+the+galaxy&apikey=thewdb", function(error, response, body){
          if (!error && response.statusCode ==200){
            res.send(body);
          }  
        })
    });
    
    
    app.listen(3000,function(){
      console.log("Movie App has started!!!");
    });
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2015-08-10
      • 2018-09-02
      相关资源
      最近更新 更多