[英]node.js:Can't set headers after they are sent
我目前正在學習Node.js,並且嘗試創建購物清單應用程序,並且嘗試實現搜索路線,該路線檢查查詢是否匹配val,這是代碼
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
//Array List
let list = ['Fish', 'Lettuce', 'Chicken'];
//Set view engine to pug
app.set('view engine', 'pug');
//use bodyParser
app.get('/', function(request, response){
response.render('list', {list});
});
app.get('/search', function(request, response){
return list.map(function(val){
if(request.query.search === val){
return response.send('Yup you got ' + val);
}
response.send('Not found')
});
});
app.get('/new-item', function(request, response){
response.render('new');
});
app.post('/add-item', function(request, response){
let add = response.send(request.body);
list.push(add);
});
app.listen(port, function(){
console.log('Listening on Port 3000');
});
現在問題出在/search
路由if
有條件的if
下,我知道我收到此錯誤的原因是因為我無法使用response.send
兩次,我正在根據情況確定是否要發送任一響應被滿足。 任何幫助表示贊賞,謝謝
將response.send('Not found')
移出循環。 另外,您不應在此處使用Array.map
,而應使用Array#find
:
app.get('/search', function(request, response) {
let foundVal = list.find(function(val) {
if (request.query.search === val) {
return val;
}
});
if (foundVal) {
return response.send('Yup you got: ' + foundVal);
}
response.send('Not found');
});
使用回調構建您的結構。
app.get('/search', function(request, response){
checkValue(list,request.query.search,function (result) {
response.send({
data : result
});
});
function checkValue(list, value, callback) {
var isHere = false;
list.map(function(val){
if(request.query.search === val){
isHere = true;
}
});
callback(isHere);
}
});
在這段代碼中:
app.get('/search', function(request, response){
return list.map(function(val){
if(request.query.search === val){
return response.send('Yup you got ' + val);
}
response.send('Not found')
});
});
您正在.map()
回調內部執行response.send()
,這意味着您可以輕松地多次調用它,並且詢問的錯誤表明您多次調用它。 請記住, .map()
內部的return
不會超出.map()
。 它僅從回調函數的該迭代返回,然后.map()
的下一個迭代將在您return
后繼續。
如果要中斷迭代,請切換到常規的for
循環進行迭代(不使用回調),然后您的return
將執行您想要的操作:
app.get('/search', function(request, response){
for (let val of list) {
if (request.query.search === val){
return response.send('Yup you got ' + val);
}
}
response.send('Not found')
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.