🥬🐕 node的第一个接口:注册

753 阅读1分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

新建node项目

新建一个文件夹

npm init 

生成package.json现在就可以使用npm了。

入口文件

生成 server.js入口文件

touvh server.js

express

我们想要实现http通信 就要使用 express

安装express

 npm i express

此时可以发现node_modules文件出现了。因为有了依赖

热插拔

我们如果不使用它每次修改都要重启,才能看到改动

npm install nodemon -g 

添加启动配置

  • npm run start 用于线上调试当然本地也可以使用
  • npm run server 用于我们本地调试,其启动的是 nodemon
"scripts": {
    "start": "node server.js",
    "server": "nodemon server.js"
  },

server.js

  • require 引入 express
  • 创建一个 express实例
  • get请求
  • 如果开发环境使用process.env.PORT 本地使用 5000
  • 监听5000端口 如果运行打印
const express = require('express')
const app = express()

app.get("/",(req,res)=>{
    res.send("Hello world")
})
const port = process.env.PORT || 5000

app.listen(port,()=>{
    console.log(`server running on ${port}`)
})

如果在控制台成功打印就说明连接上了

操作mongodb

mongodb安装如果是Mac的请看 这篇文章 操作mongodb的插件有很多,这里我们使用mongoose 安装插件

npm install mongoose

新建一个config文件夹 📂 ,然后建一个 keys.js文件

module.exports = {
    // 没有数据库和密码的本地服务 mine
    mongoURI : "mongodb://localhost/mine
}
// 引入mongoose
const mongoose = require('mongoose')
// 我们把数据的驱动连接URL 写到了另一个文件config文件架下的keys.js中
const db = require("./config/keys").mongoURI
// 连接 成功会打印
mongoose.connect(db).then(()=>{
    console.log("connected")
}).catch(err=> console.log(err))

写个测试接口

新建个文件夹 routes 其下面再建一个api。然后新建一个user.js文件

// 引入express
const express = require('express');
// 引入Router
const router = express.Router();
// 写个接口 返回json {'msg':'you are success'}
router.get("/test",(req,res)=>{
    res.json({'msg':'you are success'})
})
// 导出 router
module.exports = router;

在 server.js中引用 users.js

// 引入 users.js
const users = require('./routes/api/users')
// 使用router
app.use('/api/users',users);

在浏览器中输入路由 /api/users/test 端口是5000

image.png

新建模型

新建个文件夹models 在其下面新建个userModel.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema;

// Create Schema
const UserSchema = new Schema({
    // 字段
    name:{
        // 类型
        type:String,
        // 是否必须
        required:true
    },
    email:{
        type:String,
        required:true
    },
    password:{
        type:String,
        required:true
    },
    // 头像我们这次先不用
    avatar:{
        type:String
    },
    date:{
        type:Date,
        default:Date.now
    }
})
module.exports = User = mongoose.model("users",UserSchema)

然后在 users.js中引入

const User = require('../../models/userModel')

新建post请求

之前我们想要使用post请求,都需要安装body-parser。

npm install body-parser

但是现在express已经废弃了body-parser

image.png 然后我们这么写 注意app.use也是有顺序的,我们最好把它加载前面。 server.js

app.use(express.urlencoded({extended:false}))
app.use(express.json())

在 users.js 新建一个请求,我们测试一下,打印请求的body

router.post('/register',(req,res)=>{
    console.log(req.body)
})

然后用postman 发起一个请求

image.png

可以在我们的控制台中看到输出就是测试成功了。

image.png

完成注册接口

User是引入的我们刚才创建好的数据modal

密码加密

使用bcrypt

npm install bcrypt
router.post('/register',(req,res)=>{
    // console.log(req.body)
    // 查询数据库中是否有邮箱
    User.findOne({email:req.body.email})
    .then((user)=>{
        if(user){
           return res.status(400).json({email:"邮箱已被注册"}) 
        }else{
            const newUser = new User({
                name : req.body.name,
                email : req.body.password,
                password : req.body.password
            })
            // 参数加密方式 10 
            bcrypt.genSalt(10, function(err, salt) {
                bcrypt.hash(newUser.password, salt, (err, hash)=>{
                    // err是异常  hash是加密后的
                    if(err) throw err;
                    newUser.password = hash;
                    newUser.save()
                           .then(user => res.json(user))  // 成功会返回一个user,然后我们response返回去就行了
                           .catch(err=> console.log(err))  // 如果失败得到一个catch
                });
            });
        }
    })

})

然后在postman试一试 image.png 再去MongoDB中查询一下

image.png

最后完整的代码

config/keys.js

module.exports = {
    // 没有数据库和密码的本地服务
    mongoURI : "mongodb://localhost/mine"
}

routes/api/users.js

const express = require('express');
const router = express.Router();
const User = require('../../models/userModel')
const bcrypt = require('bcrypt')
/**
 * $route  GET  /api/users/test
 * @desc 返回的请求的json数据
 * @access public
 */
router.get("/test", (req, res) => {
    res.json({ 'msg': 'you are success' })
})
/**
 * 
 * 
 */
router.post('/register',(req,res)=>{
    // console.log(req.body)
    // 查询数据库中是否有邮箱
    User.findOne({email:req.body.email})
    .then((user)=>{
        if(user){
           return res.status(400).json({email:"邮箱已被注册"}) 
        }else{
            const newUser = new User({
                name : req.body.name,
                email : req.body.password,
                password : req.body.password
            })
            // 参数加密方式 10 
            bcrypt.genSalt(10, function(err, salt) {
                bcrypt.hash(newUser.password, salt, (err, hash)=>{
                    // err是异常  hash是加密后的
                    if(err) throw err;
                    newUser.password = hash;
                    newUser.save()
                           .then(user => res.json(user))  // 成功会返回一个user,然后我们response返回去就行了
                           .catch(err=> console.log(err))  // 如果失败得到一个catch
                });
            });
        }
    })

})
module.exports = router;

server.js

const express = require('express')
const mongoose = require('mongoose')
// 引入 users.js
const users = require('./routes/api/users')

const app = express()
//  DB config
const db = require("./config/keys").mongoURI
mongoose.connect(db).then(()=>{
    console.log("connected")
}).catch(err=> console.log(err))

app.get("/",(req,res)=>{
    res.send("Hello world")
})
// 
app.use(express.urlencoded({extended:false}))
app.use(express.json())

// 使用router
app.use('/api/users',users);




const port = process.env.PORT || 5001



app.listen(port,()=>{
    console.log(`server running on ${port}`)
})