【问题标题】:Express-winston middleware error on GET and POST request to mongoDB对 mongoDB 的 GET 和 POST 请求的 Express-winston 中间件错误
【发布时间】:2020-08-29 02:25:07
【问题描述】:

我有以下结构:

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)
    }
})

我对文件夹结构、语法和我能想到的一切都进行了三次检查,但我认为我对温斯顿缺乏了解。当我为用户执行 GET 请求时出现以下错误:

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

我感觉这是一个基本错误,我遗漏了一些简单的东西。有人对导致错误的原因有什么想法吗?

【问题讨论】:

    标签: javascript node.js mongodb express logging


    【解决方案1】:

    这是因为您的记录器和数据库未导入到您的server.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()
    

    const port = process.env.PORT || 5000;
    
    const logger = require('./logger.js')
    const database = require('./database/createDatabase.js')({ logger })
    const app = require('./app/createExpressApp.js')({ logger, database });
    const server = require('http').createServer()
    

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

    这是来自 express-winston 的错误,它要求 winstonInstance 不为空。我敢打赌,如果你尝试在 createExpressApp.js 中输入 console.log(logger),它会返回 undefined。

    根据 express-winston 文档:https://www.npmjs.com/package/express-winston

    PS。确保添加:

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

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

    【讨论】:

    • 我已经想通了,但这就是问题所在!
    • 完美,这对我来说是一个美妙的时刻哈哈
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2020-05-09
    • 1970-01-01
    • 2022-11-07
    • 2021-09-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多