NodeJS Создание API REST Post - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь научиться создавать конечные точки REST с NodeJS.

Не могли бы вы дать мне представление о том, как бы я написал бизнес-логику для следующей конечной точки POST?

Feature: Add a measurement
  I want to be able to capture a measurement of several metrics at a specific time

  Scenario: Add a measurement with valid (numeric) values
    # POST /measurements
    When I submit a new measurement as follows:
      | timestamp                  | temperature | dewPoint | precipitation |
      | "2015-09-01T16:00:00.000Z" | 27.1        | 16.7     | 0             |
    Then the response has a status code of 201
    And the Location header has the path "/measurements/2015-09-01T16:00:00.000Z"

  Scenario: Cannot add a measurement with invalid values
    # POST /measurements
    When I submit a new measurement as follows:
      | timestamp                  | temperature    | dewPoint | precipitation |
      | "2015-09-01T16:00:00.000Z" | "not a number" | 16.7     | 0             |
    Then the response has a status code of 400

  Scenario: Cannot add a measurement without a timestamp
    # POST /measurements
    When I submit a new measurement as follows:
      | temperature | dewPoint | precipitation |
      | 27.1        | 20       | 0             |
    Then the response has a status code of 400

таким образом, у меня есть server.js и routes.jsдо сих пор, теперь мне интересно, как бы я добавил бизнес-логику и соответствующую маршрутизацию, которая бы соответствовала запросам выше.

// server.js
import { createServer } from 'http';
import handler from './routes';

const PORT = +process.env.PORT || 5000;

const server = createServer(handler)
  .on('listening', () => {
    const { port } = server.address();
    console.log(`Server listening on port ${port}`);
  })
  .on('close', () => console.log('Server closed.'));

server.listen(PORT);
// routes.js
const server = express();
server.use(parseJsonBody());

server.get('/', (req, res) => res.send('server is running!'));

registerMeasurements(server);
registerStats(server);

export default server;

1 Ответ

0 голосов
/ 02 марта 2019

Раньше нам приходилось использовать bodyParser, но теперь вы можете использовать вместо bodyParser

Пример анализатора тела

npm install --save body-parser

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

app.post('/measurement', function(req, res) {
    var timestamp = req.body.timestamp; // Post body value, ex. measurement
    var temperature = req.body.temperature;
});

Теперь нам не нужно использовать bodyParser, мы могли бы сделать следующее, что эквивалентно

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

Вот пример для некоторой базовой логики if после запроса post

const express = require('express');
const app = express();

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
    extended: true
}));


app.post(`/mesurement`, (req, res) => {
    var temperature = req.body.temperature;
    let timestamp = req.body.timestamp;
    let dewPoint = req.body.dewpoint;
    let precipitation = req.body.precipitation;
    if (temperature && timestamp && dewPoint && precipitation !== undefined) {
        temperature = parseFloat(temperature);
        dewPoint = parseFloat(dewPoint);
        precipitation = parseFloat(precipitation);
        if (Number.isInteger(temperature)
            && Number.isInteger(dewPoint)
                && Number.isInteger(precipitation)) {
            console.log("We recieved, ", temperature, dewPoint, precipitation)
            res.status(201)
        }
    }

});

app.listen(3000);

Проверьте конечные точки вашего сообщения с помощью https://www.getpostman.com

enter image description here

...