Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向mongoDB发出GET和POST请求时出现Express winston中间件错误_Javascript_Node.js_Mongodb_Express_Logging - Fatal编程技术网

Javascript 向mongoDB发出GET和POST请求时出现Express winston中间件错误

Javascript 向mongoDB发出GET和POST请求时出现Express winston中间件错误,javascript,node.js,mongodb,express,logging,Javascript,Node.js,Mongodb,Express,Logging,我的结构如下: logger.js: const logger = module.exports = require('winston') logger.add(new logger.transports.File( { name: 'debug-file', filename: 'log.log', level: 'debug', handleExceptions: true, humanReadableUnhandledException: true

我的结构如下:

logger.js:

const logger = module.exports = require('winston')

logger.add(new logger.transports.File(
{
    name: 'debug-file',
    filename: 'log.log',
    level: 'debug',
    handleExceptions: true,
    humanReadableUnhandledException: true,
    exitOnError: true,
    json: false,
    maxsize: 104857600,
    maxfiles: 5
}))

logger.add(new logger.transports.Console(
{
    name: 'error-console',
    level: 'error',
    handleExceptions: true,
    humanReadableUnhandledException: true,
    exitOnError: true
}))
server.js:

const port = process.env.PORT || 5000;

const logger = require('./logger.js')
const database = require('./database/createDatabase.js')({ logger })
const app = require('./app/createExpressApp.js')
const server = require('http').createServer()

server
    .on('request', app)
    .on('listening', function() {
        const addr = this.address()
        const bind = typeof addr === 'string' ? `pipe ${addr}` : `port ${addr.port}`
        logger.info(`Listening on ${bind}`)
    })
    .on('error', function(error) {
        if (error.syscall !== 'listen') throw error
        const addr = this.address() || { port }
        const bind = typeof addr === 'string' ? `pipe ${addr}` : `port ${addr.port}`
        switch (error.code) {
            case 'EACCES':
                logger.error(`${bind} requires elevated privileges`)
                process.exit(1)
            case 'EADDRINUSE':
                logger.error(`${bind} is already in use`)
                process.exit(1)
            default:
                throw error
        }
    })
    .listen(port)
createDatabase.js:

const mongoose = require('mongoose')
const glob = require('glob')
const path = require('path')

module.exports = ({ logger }) => {

    const url = process.env.ATLAS_URI
            || "mongodb+srv://(removed for stackoverflow question)"

    mongoose.connect(url)

    const db = glob.sync('./schemas/**/*.js', { cwd: __dirname })
    .map(filename => {
        return {
            schema: require(filename),
            name: path
                .basename(filename)
                .replace(path.extname(filename), ''),
        }
    })
    .map(({name, schema}) => mongoose.model(name, schema))
    .reduce((db, model) => {
        return {
            ...db,
            [model.modelName]: model,
        }
    }, {})

    mongoose
    .connection
    .on('error', error => {
        throw error
    })
    .once('open', () => logger.info(`MongoDB connection established successfully!`) && 
        console.log(`MongoDB connection established successfully!`))

    return db
}
最后是getUsers.js:

const Router = require('express').Router

// export to router
module.exports = Router({mergeParams: true})
.get('/v1/users', async (req, res, next) => {
    try {
        const users = await req.db.User.find()
        res.send(users)
    }
    catch (error) {
        next(error)
    }
})
我已经三次检查了文件夹的结构、语法和我能想到的一切,但我认为我对winston缺乏了解。在执行用户的get请求时,出现以下错误:

{"error":{},"level":"error","message":"uncaughtException: transports or a winstonInstance are required by express-winston middleware

我感觉这是一个基本的错误,我错过了一些简单的东西。有人知道是什么导致了错误吗?

这是因为日志记录器和数据库没有导入到
服务器.js

更改服务器的server.js导入

const port = process.env.PORT || 5000;

const logger = require('./logger.js')
const database = require('./database/createDatabase.js')({ logger })
const app = require('./app/createExpressApp.js')
const server = require('http').createServer()

数据库和Winston logger都已导出,但它们不会被推送到所需的
createExpressApp.js
,这将删除此错误,并将来自邮递员/服务器的请求正确记录在日志文件中

这是express winston的一个错误,它要求
winstonInstance
不为空。我打赌,如果您尝试在
createExpressApp.js
console.log(logger)
,它将返回未定义

根据winston express文档:

请确保您添加:

mongoose.connect(url, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
  });

将这些方法添加到您的mongoDB URL,否则您将收到折旧警告:D

我已经找到了答案,但这就是问题所在!太好了,这对我来说是一个非常好的时刻哈哈
mongoose.connect(url, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useFindAndModify: false,
    useUnifiedTopology: true,
  });