Javascript NodeJS response.render():Can';t在发送邮件后设置邮件头

Javascript NodeJS response.render():Can';t在发送邮件后设置邮件头,javascript,node.js,express,Javascript,Node.js,Express,因此,第一次渲染是成功的app.get(“/”,function(request,response),但是当我处理app.post(“/search”)时,urlencodedParser,function(request,response) 我得到一个错误: c:\weather\views\main.hbs:发送邮件后无法设置邮件头 我读到,函数res.render()应该每个请求只调用一次。,但我不明白-如果我不能使用新数据再次调用render,如何使用视图(把手)更改数据 var ex

因此,第一次渲染是成功的
app.get(“/”,function(request,response)
,但是当我处理
app.post(“/search”)时,urlencodedParser,function(request,response)

我得到一个错误:

c:\weather\views\main.hbs:发送邮件后无法设置邮件头

我读到,
函数
res.render()
应该每个请求只调用一次。
,但我不明白-如果我不能使用新数据再次调用render,如何使用
视图(把手)
更改数据

var express=require(“express”);
var fs=要求(“fs”);
var bodyParser=require(“主体解析器”);
var hbs=要求(“hbs”);
//创建对象
var-app=express();
//URL编码
var urlencodedParser=bodyParser.urlencoded({
扩展:false
});
//阅读city.json
var content=fs.readFileSync(“./city.list.json”,“utf8”);
var cities=JSON.parse(内容);
//设置视图把手
应用程序集(“查看引擎”、“hbs”);
//注册帮助程序-结果块
注册表帮助器(“结果块”,函数(数组){
var res=“”;
if(数组[0]=“false”){
res='×;未找到!“+数组[1]+”不正确。”;
}else if(数组[0]=“true”){
res=‘成功!!!’;
}
返回新的hbs.SafeString(res);
})
app.get(“/”,函数(请求、响应){
//sendfile('index.html');
response.render(“main.hbs”{
城市价值:“Zaporozhye”,
数据:[]
})
});
app.post(“/search”),urlencodedParser,函数(请求,响应){
var city=request.body.city;
变量idCity=-1;
for(设i=0;i

文件
天气
搜寻
{{ResultBlock data}}

您应该删除response.end()行,因为您使用了response.render

response.render
是一个异步函数。因此,渲染是在当前执行上下文完成后完成的

在代码末尾调用
response.end()
,因此在渲染开始之前完成响应

完成响应后,异步呈现函数将启动并尝试设置标头,但这是不可能的,因为响应已经完成,这就是出现该错误的原因

删除
response.end()
,一切正常。

该函数用于发送响应的标题并结束响应过程。
另一方面,该函数呈现视图,还发送头并结束响应。
在同一响应对象上调用这两个函数将尝试为同一请求发送两次头,这是不可能的,因为每个请求只能有一个响应。
因此,从“/search”的post-route处理程序的末尾删除
response.end()
,应该可以解决这个问题。
更新了“/search”POST路由处理程序的代码:

app.post("/search", urlencodedParser, function(request, response) {
  var city = request.body.city;
  var idCity = -1;
  for (let i = 0; i < cities.length; i++) {
    if (cities[i].name == city) {
      idCity = cities[i].id;
      break;
    }
  }

  if (idCity != -1) {
    response.render("main.hbs", {
      city_value: city,
      data: ["true", city]
    })
  } else {
    response.render("main.hbs", {
      city_value: city,
      data: ["false", city]
    })
  }
});
app.post(“/search”),urlencodedParser,函数(请求,响应){
var city=request.body.city;
变量idCity=-1;
for(设i=0;i