2016-11-06 3 views
0

Я написал простой api для извлечения записей с помощью GET/tours /: id. Это работает, когда я пишу идентификатор на URL. Пример:/tours/0, но нет, если я напишу в браузере только «/ tours» или туры/«простой узел api restfull, get method по id из массива

Мне пришлось написать еще один блок, чтобы получить полный массив с помощью GET:/toursall или неправильно использовать функцию onlye, чтобы получить все записи и id в одной и той же функции? Я обновил код, который я нашел в книге. Я использую узел 6.7.0 и express ~ 4.0.0

var express = require('express'); 
var app = express(); 
app.set('port', process.env.PORT || 3000); 
// custom 404 page 

var tours = [ 
    { id: 0, name: 'Hood River', price: 99.99 }, 
    { id: 1, name: 'Oregon Coast', price: 149.95 }, 
]; 


app.get('/toursall', function(req, res) { 

    res.json(tours); 
}); 


app.get('/tours/:id', function(req, res) { 
    responsetours = req.params.id !== undefined ? 
     tours.filter( function(obj) {return obj.id== req.params.id}) 
     : tours; 
    res.json(responsetours); 
}); 


app.use(function(req, res){ 
    res.type('text/plain'); 
    res.status(404); 
    res.send('404 - Not Found'); 
}); 
// custom 500 page 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.type('text/plain'); 
    res.status(500); 
    res.send('500 - Server Error'); 
}); 
app.listen(app.get('port'), function(){ 
    console.log('Express started on http://localhost:' + 
     app.get('port') + '; press Ctrl-C to terminate.'); 
}); 

ответ

1

Вы можете попробовать с ? в конце для опциональных пар как ниже,

app.get('/tours/:id?', function(req, res) { 
    responsetours = req.params.id !== undefined ? 
     tours.filter( function(obj) {return obj.id== req.params.id}) 
     : tours; 
    res.json(responsetours); 
}); 
+0

Это хорошая практика, чтобы иметь одну функцию для записей всех и одну запись? – stackdave

+0

Исходя из требования. Если это действительно просто, как у вас, вы можете иметь одну общую функцию. Но если вам нужны дополнительные манипуляции/внешние вызовы, вы можете разделить их на два разных вызова. Infact, если вы извлекаете его из базы данных, например, mongodb, было бы хорошо, если бы у вас были отдельные вызовы для «findOne» и еще один для 'find'. – Aruna

0
  1. app.get('/toursall', function(req, res) { =>app.get('/tour', function(req, res) {. вы REST API будет больше consistens.
  2. Жестко запрограммированные массивы не является лучшим решением, если у вас есть тысячи эль энтов. Возможно, вам нужно хранить свои данные в базе данных, например, в MongoDB.
  3. Если вам не нужна база данных, а затем использовать файл JSon для туров и сделать var tours = require('./tours.json');
+0

благодаря galk, я должен был выбрать другой ответ, потому что первая проблема заключалась в том, чтобы понять параметры, я просто практиковал основы узла и выражения, прежде чем работать с db и реальными структурами. – stackdave