我是新手,正在从各种在线资源中学习带有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
});
});
});
答案 0 :(得分:0)
将Express视为一个非常轻便且基本的框架,它紧密地围绕NodeJS的核心。您遇到的大多数问题都不是Express特有的,它们只是扩展或更改核心功能的不同npm软件包。
应用程序解析数据的方式很重要。 Academind可以处理图片上传,因为它使用了multer
包。这是一个中间件,可以处理使用multipart/form-data
编码类型完成的所有请求,这是将图像发送到服务器的方式。预期的编码类型也是#5的答案。
这两个文件只是个人喜好。您可以在一个文件中完成所有操作,但是许多人喜欢在其app.js
中要求server.js
来进一步分隔每个文件的“职责”。
这与上面类似,它们如何进一步分隔文件的职责。如果仔细观察,两者最终都将被路由器调用。通过在其中一个项目中创建Controller文件,他们将所谓的“业务逻辑”与路由定义分开。它做同样的事情,但有人认为它更有条理。
这是两个参数还是三个参数req, res, next
?如果是这样,那么这些实际上可用于快递中的每条路线。很多时候,您不需要在代码中使用next
,因此程序员将其忽略了。
这返回到您的请求的预期编码类型。各种中间件将根据需要处理并允许使用不同的编码类型。 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);
}
});