mongodb 在服务启动后,为什么 post 请求一次就直接退出?

不明白为什么写了一个登录的接口后,mongodb的连接就出问题了,只要登录请求发一次,请求结束后,它的服务就会直接退出。

启动服务时,连接数据库:

const mongoose = require("mongoose");
const db = require('../db/config/key').mongoURI;
//connect db
mongoose.connect(db,{ useNewUrlParser: true }).then( () => console.log('DB Successful!')).catch((err) => console.log(err));

下面是我的 登录接口:

/**登录 
 * authenticate()方法有3个参数,第一是name,即验证策略的名称,第二个是options,即
*/
router.post("/login",urlencodedParser,(req,res,next) => {
    const loginUser = {
        email:req.body.email,
        password:req.body.password
    };

    console.log(loginUser);
    passport.authenticate('local', {
      successRedirect:'/',
      failureRedirect: '/admin/login',
      failureFlash: true
    })(req, res, next);

    // UserSchema.findOne({
    //     email:loginUser.email
    //   }).then(users => {
    //     console.log('user存在吗?' + users)
    //     if(!users){
    //       return done(null, false, {message: 'No User Found'});
    //     } 
    //     //验证密码
    //     bcrypt.compare(loginUser.password, users.password, (err, isMatch) => {
    //       if(err) throw err;
    //       if(isMatch){
    //         res.redirect('/')
    //       } else {
    //         res.redirect('/admin/login')
    //       }
    //     })
    //   })
  });

passport.js

const UserSchema = require('../models/UserSchema');


module.exports = function(passport){
  passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => {
    console.log('获取的字段:' + email+'/'+ password)
    // Match user
    UserSchema.findOne({
      email:email
    }).then(users => {
      console.log('user存在吗?' + users)
      if(!users){
        return done(null, false, {message: 'No User Found'});
      } 

      // Match password
      bcrypt.compare(password, users.password, (err, isMatch) => {
        console.log('password   ' + password);
        console.log('user.password' + users.password);
        if(err) throw err;
        if(isMatch){
          console.log('isMatch   ' + isMatch)
          //登录成功,返回 token
          // const rule = {
          //     id: users._id,
          //     email:users.email,
          //     admin:'true'
          // };

          // jwt.sign(rule,secretKey,{expiresIn:3600},(err,token) => {
          //   if(err) throw err;
          //   res.json({
          //       sucess:true,
          //       token:"Bearer " + token
          //   });
          // });
          return done(null, users);
        } else {
          return done(null, false, {message: 'Password Incorrect'});
        }
      })
    })
  }));

只要发一次请求,就会直接退出,然后在窗口就会有这样的提示,又断掉了。

{ MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
    at Pool.<anonymous> (E:\API\anviz\anviz\web\node_modules\mongodb-core\lib\topologies\server.js:564:11)
    at Pool.emit (events.js:182:13)
    at Connection.<anonymous> (E:\API\anviz\anviz\web\node_modules\mongodb-core\lib\connection\pool.js:317:12)
    at Object.onceWrapper (events.js:273:13)
    at Connection.emit (events.js:182:13)
    at Socket.<anonymous> (E:\API\anviz\anviz\web\node_modules\mongodb-core\lib\connection\connection.js:246:50)
    at Object.onceWrapper (events.js:273:13)
    at Socket.emit (events.js:182:13)
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]: {} }

我在本地配置有 mongodb,并在windows中也有添加 mongodb 的服务。
当启动电脑后,mongodb 服务也启动了,在 windows 的启动服务中的配置为:E:APIDBbinmongod.exe --bind_ip 192.168.70.181 --logpath E:APIDBlogmongodb.log --logappend --dbpath E:APIDBdatadb --port 27017 --service

但是每次服务启动后,也必须要手动敲一遍:mongod.exe --dbpath E:APIDBdatadb 才会启动成功,然后这个手动启动的服务只能使用一次,请求一次就直接断掉了?

请问是什么原因呢?
非常着急,非常感谢!

阅读 2.2k
1 个回答

你这不是连接失败的错误吗~

你启动了mongodb的服务是没错,关键是我没看你程序有连接的操作啊。