2

我正在尝试将我的节点应用程序与 MongoDB 连接起来。当我得到输出时,代码似乎正在执行 服务器正在端口 5000 上运行 MongoDB 数据库连接在终端上成功建立但是当我尝试从失眠中发布获取时,大约需要两分钟才能收到错误错误:服务器没有返回任何内容(没有标题,无数据)

const express = require('express');
//const bodyParser = require('body-parser');
const cors =  require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

const uri = process.env.ATLAS_URI;

mongoose.connect( uri, {useUnifiedTopology: true, useNewUrlParser: true}, () => { console.log("MongoDB database conection established successfully")}).catch(err => console.log(err));

const exercisesRouter = require('./routes/exercises');
const usersRouter = require('./routes/users');

app.use('/exercises', exercisesRouter);
app.use('/users', usersRouter);

//emitter.setMaxListeners();

app.listen(port, () => {
    console.log('Server is running on port : ' + port);
});

我正在学习教程,这些是我拥有的其他文件 exercise.model.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const exerciseSchema = new Schema({
    username: {type: String,required: true},
    description: {type: String,required: true},
    duration: {type: Number,required: true},
    date: {type: Date,required: true},
    },
{
    timestamps: true,
});


const Exercise = mongoose.model('Exercise', exerciseSchema);

module.exports = Exercise;

练习.js

const router = require('express').Router();
let Exercise = require('../models/exercise.model');

router.route('/').get((req, res) => {
  Exercise.find()
    .then(exercises => res.json(exercises))
    .catch(err => res.status(400).json('Error: ' + err));
});

router.route('/add').post((req, res) => {
  const username = req.body.username;
  const description = req.body.description;
  const duration = Number(req.body.duration);
  const date = Date.parse(req.body.date);

  const newExercise = new Exercise({
    username,
    description,
    duration,
    date,
  });

  newExercise.save()
  .then(() => res.json('Exercise added!'))
  .catch(err => res.status(400).json('Error: ' + err));
});

module.exports = router;

用户.js

const router = require('express').Router();
let User = require('../models/user.model');

router.route('/').get((req,res) => {
        User.find()
        .then(users => res.json(users))
        .catch(err => res.status(400).json('Error: ' + err));
    });

router.route('/add').post((req,res) => {
    const username = req.body.username;

    const newUser = new User({username});

    newUser.save()
    .then(() => res.join('User added!'))
    .catch(err => res.status(400).json('Error: ' + err));
})

module.exports = router;

用户模型.js

const mongoose = require('mongoose');

    const Schema = mongoose.Schema;

    const userSchema = new Schema({
        username: {
            type: String,
            required: true,
            unique: true,
            trim: true,
            minlenght: 3
        },
    },{
        timestamps: true,
    });


    const User = mongoose.model('User', userSchema);

module.exports = User;

当我在浏览器上访问http://localhost:5000并且在检查器错误中显示 Refused to load the image ' http://localhost:5000/favicon.ico '时,我也得到 Cannot GET /因为它违反了以下内容内容安全策略指令:“default-src 'none'”。请注意,'img-src' 没有显式设置,因此 'default-src' 用作后备。这可能很多,但我正在尝试学习如何将后端与前端连接起来,如果有人可以指导我,我将不胜感激。提前谢谢你。

4

3 回答 3

0

这个问题似乎与CORS有关。这意味着您创建的 express API 不会接受来自其他域的调用,并且期望交互来自同一应用程序。当您使用失眠症时,它是一个单独的桌面应用程序或其他东西,快递将阻止对路线的访问。这是默认行为。

您需要获取CORS 中间件并根据需要设置路由。只需按照文档。

允许所有访问的快速测试:

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

app.use(cors());

app.get('/users', (req, res) => {...
...
于 2019-11-15T04:08:56.553 回答
0

我也在学习相同的教程:https ://www.youtube.com/watch?v=7CqJlxBYj-M

问题在于app.use(express.json());

把它注释掉,它会正常工作的。但是,当您进行发布请求时,您将无法解析 JSON 数据。我不确定为什么 express.json() 不起作用。

但无论哪种方式,您都可以使用 Body-Parser 来解决该问题。第一个npm i body-parser将其安装到后端文件夹中的包管理器的用户。然后将以下代码复制到您的 index.js

const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())

添加此代码,您会没事的。这个答案给出了 express.json & body-parser 的详细解释。

express.json() 是 express 内置的一种方法,用于将传入的请求对象识别为 JSON 对象。

我推荐使用 body-parser(它是一个 NPM 包)来做同样的事情。它是由构建 express 的同一位窥视者开发的,旨在与 express 一起使用。body-parser 曾经是 express 的一部分。

于 2020-05-22T15:05:08.170 回答
0

还有另一种添加CORS的方法

app.use(function (req, res, next) {
    //Enabling CORS
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, 
    Accept, x-client-key, x-client-token, x-client-secret, Authorization");
    next();
});
于 2019-11-15T05:36:12.997 回答