【发布时间】: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