Javascript 向mongoDB发出GET和POST请求时出现Express winston中间件错误
我的结构如下: logger.js: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
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,
});