2017-10-02 18 views
0

現在、Node.jsを学習しています。ショッピングリストアプリケーションを作成しようとしています。検索ルートを実装しようとしています。クエリはヴァルに一致し、ここでのコードnode.js:送信後にヘッダーを設定できません

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'); 
}); 

は、今の問題は、私は私は、二回response.sendを使用することはできませんので、私はエラーを取得しています理由は知っている、条件付き/searchルートのifとなっています条件が満たされた場合に基づいて、いずれかの応答を送信する方法を探します。 助けを歓迎します ありがとう

+0

あなたの状態が失敗した場合は "else"を使用してください。 –

+0

もう一つの条件を入れてみてください – Ali

+0

私は実際にそれをelseブロックに入れましたが、まだsamwです – ogbeh

答えて

1

ループの外側に移動response.send('Not found')

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'); 
}); 
+0

ねえ@alexmacあなたは私を助けてくれますかhttps://stackoverflow.com/questions/46484088/how-to-store- data-in-mongodb-using-mongoose-and-async-waterfall-model –

1

は、コールバックを使用して構造をビルドします。また、あなたの代わりにArray#findを使用し、ここでArray.mapを使うべきではありません。

コードのこの部分で
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); 
    } 
}); 
0

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') 
}); 
+0

このコードは機能しません。要素が2番目の反復で見つからない場合は、エラーがスローされます。 – alexmac

+0

こんにちは@ jfriend00あなたは私を助けてもらえますか?https://stackoverflow.com/questions/46484088/how-to-store-data-in-mongodb-using-mongoose-and-async-waterfall-model –

+0

@ogbeh 'list'に複数の項目があり、いくつかの一致があり、そうでないものがある場合に動作が期待されるものを完全に記述します。そして、その記述と一致するように自分のコードを編集するために時間を費やします。あなたは現在、望ましい行動が何であるかは言いません。存在しない仕様に一致するコードを書くことはできません。今のところあなたの質問は不明です。たぶんいくつかの他の答えは、あなたが望んだものを正しく推測していたかもしれませんが、良い質問は推測を必要としません - 彼らは、望ましい動作の正確な詳細を書きます。 – jfriend00

関連する問題