簡體   English   中英

node.js:發送后無法設置標頭

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM