无法理解Node Express的各种API

时间:2018-08-11 03:22:06

标签: node.js express post postman

我是新手,正在从各种在线资源中学习带有MongoDB 4.0的Node Express。当我浏览两个不同的教程时,我搞砸了它的不同编码风格。

教程1 Callicoder Tutorial

教程2 Academind Tutorial

在两个教程中,我都对以下主题感到困惑。

+--+---------------------------+---------------------------+---------------------------+
|# |       Tutorial 1          |       Tutorial 2          |      Clarification        |
|  |      (Callicoder)         |       (Academind)         |                           |
+--+---------------------------+---------------------------+---------------------------+
|1 |  Can not upload images    |  Can upload images        |  Why can't in Callicoder? |
+--+---------------------------+---------------------------+---------------------------+
|2 |  One .js file (server.js) |  server.js and app.js     | Why two files in Academind|
+--+---------------------------+---------------------------+---------------------------+
|3 |  POST method using        |  POST method using        |Difference of POST methods,|
|  |   router.post             |   exports.create          |What means 'exports.create'|
+--+---------------------------+---------------------------+---------------------------+
|4 |  Use two parameters       | Use three parameters      | Why three in image upload |
+--+---------------------------+---------------------------+---------------------------+
|5 | Using params in Postman   |Using form-data in POstman |  How they are different   |
+--+---------------------------+---------------------------+---------------------------+

Callicoder的代码摘录

const express= require("express");
const multer = require('multer');
const User = require('../models/user.model.js');
var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens


// POST
exports.create = ("/",(req, res, next) => 
{
    var varName= req.query.name;
    var varUname = req.body.username;
    var varPass = req.body.password;
    var varEmail = req.body.email;
    console.log(varName)

    const user = new User(
        {
            name: varName, //required
            address: req.body.address, 
            logo: req.body.logo, 
            username: varUname,  //required
            password: varPass,   //required
            phone_number: req.body.phone_number, 
            email: varEmail,  //required
            token_key : token
    });

    // Save Programe in the database
    user.save()
    .then(data => {
        res.send(
            {
                "error_message": [],
                "results":"User created successfully",
                "status": "Success",
                "token": token
            });
    }).catch(err => {
        res.status(500).send({
            error_message: err.message || "Some error occurred while creating the Programe."
        });
    });
});

Academind的代码段

const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const multer = require('multer');
const Product = require("../models/product");

//file storage code
// file filter code for jpg and png
// file upload code

router.post('/', upload.single('productImage'), (req, res, next) => {
  const product = new Product({
      _id: new mongoose.Types.ObjectId(),
      name: req.query.name,
      price: req.query.price,
      productImage: req.file.path
  });
  product.save().then(result => {
      console.log(result);
      res.status(201).json({
          message: 'Created product successfully',
          createdProduct: {
              name: result.name,
              price: result.price,
              _id: result._id,
              request: {
                  type: 'GET',
                  url: 'http://localhost:3000/products/${result._id}'
              }
          }
      });
  }).catch(err => {
      console.log(err);
      res.status(500).json({
          error: err
      });
  });
});

1 个答案:

答案 0 :(得分:0)

将Express视为一个非常轻便且基本的框架,它紧密地围绕NodeJS的核心。您遇到的大多数问题都不是Express特有的,它们只是扩展或更改核心功能的不同npm软件包。

  1. 应用程序解析数据的方式很重要。 Academind可以处理图片上传,因为它使用了multer包。这是一个中间件,可以处理使用multipart/form-data编码类型完成的所有请求,这是将图像发送到服务器的方式。预期的编码类型也是#5的答案。

  2. 这两个文件只是个人喜好。您可以在一个文件中完成所有操作,但是许多人喜欢在其app.js中要求server.js来进一步分隔每个文件的“职责”。

  3. 这与上面类似,它们如何进一步分隔文件的职责。如果仔细观察,两者最终都将被路由器调用。通过在其中一个项目中创建Controller文件,他们将所谓的“业务逻辑”与路由定义分开。它做同样的事情,但有人认为它更有条理。

  4. 这是两个参数还是三个参数req, res, next?如果是这样,那么这些实际上可用于快递中的每条路线。很多时候,您不需要在代码中使用next,因此程序员将其忽略了。

  5. 这返回到您的请求的预期编码类型。各种中间件将根据需要处理并允许使用不同的编码类型。 https://github.com/expressjs/body-parser可能是最受欢迎的一种,因为它内置于expressjs中。这就是它解释您发出的请求并设置req.body对象的方式。实际上,“ params”类型将值设置为url的一部分,并将其附加为:127.0.0.1:3000?param1=test¶m2=test。表单数据是正在发出的请求的一部分,不能作为get参数使用。

我希望这对您有帮助!

编辑:根据下面的评论,NodeJS使用许多不同的中间件来运行。从理论上讲,如果愿意,您可以执行任意多次,并且只需继续使用next即可转到中间件中的下一个功能。

例如:

app.get('/', 
   (req, res, next) => {
       // do something
       next()
   },
   (req, res, next) => {
       // this part runs when next is called
       // do something
       next()
   },
   (req, res, next) => {
       if (1==x) {
          res.send()
       } else {
          const err = new Error('Error');
          // sends to error handling middleware
          next(err);
       }
   });