javascript - Node js干净架构无法返回响应
问题描述
请我正在尝试为我的节点 js rest API 实现一个干净的架构我学习了一个教程 Using Clean Architecture for Microservice APIs in Node.js with MongoDB and Express ...我的目标是调整 HTTP 请求并调用我的控制器作为函数并返回响应
服务器.js
import express from 'express';
import dotenv from 'dotenv';
import bodyParser from 'body-parser';
import httpAdapter from './http_adapter';
import register from './register';
const app = express();
app.use(bodyParser.json());
dotenv.config();
app.post('/account/register', httpAdapter(register));
const port = 5000;
app.listen(port, () => console.log(`server running on port ${port}`));
http_adpter.js
export default function httpAdapter(controller) {
return (req, res) => {
const httpRequest = {
body: req.body,
query: req.query,
params: req.params,
ip: req.ip,
method: req.method,
path: req.path,
headers: {
'Content-Type': req.get('Content-Type'),
Referer: req.get('referer'),
'User-Agent': req.get('User-Agent'),
},
};
controller(httpRequest)
.then((httpResponse) => {
if (httpResponse.headers) {
res.set(httpResponse.headers);
}
res.type('json');
res.status(httpResponse.statusCode).send(httpResponse.body);
})
.catch((e) =>
res.status(500).send({ error: 'An unkown error occurred.' })
);
};
}
注册.js
export default function register(httpRequest) {
return () => {
try {
const user = httpRequest.body;
console.log(user);
return {
headers: {
'Content-Type': 'application/json',
},
statusCode: 201,
body: { user },
};
} catch (e) {
// TODO: Error logging
console.log(e);
return {
headers: {
'Content-Type': 'application/json',
},
statusCode: 400,
body: {
error: e.message,
},
};
}
};
}
错误
[nodemon] restarting due to changes...[nodemon] starting `babel-node ./src/server.js`
server running on port 5000
TypeError: controller(...).then is not a function
at C:\Users\tukuyoma\Desktop\odemru\server\src\/http_adapter.js:17:5
at Layer.handle [as handle_request] (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\express\lib\router\index.js:275:10)
at C:\Users\tukuyoma\Desktop\odemru\server\node_modules\body-parser\lib\read.js:130:5
at invokeCallback (C:\Users\tukuyoma\Desktop\odemru\server\node_modules\raw-body\index.js:224:16)
[nodemon] restarting due to changes...
[nodemon] starting `babel-node ./src/server.js`
解决方案
在 http_adapter.js 中,更改
controller(httpRequest)
.then((httpResponse) => {
if (httpResponse.headers) {
res.set(httpResponse.headers);
}
res.type('json');
res.status(httpResponse.statusCode).send(httpResponse.body);
})
.catch((e) =>
res.status(500).send({ error: 'An unkown error occurred.' })
);
到
try{
const httpResponse = controller(httpRequest);
if (httpResponse.headers) {
res.set(httpResponse.headers);
}
res.type('json');
res.status(httpResponse.statusCode).send(httpResponse.body);
}
catch (err) {
res.status(500).send({ error: 'An unkown error occurred.' });
}
如果其他一切都很好,应该可以工作。
推荐阅读
- java - Android中的日期格式问题
- xml - 在 XSLT 1.0 中使用 document() 时防止 xml 缓存
- objective-c - 是否有使用#selector 的 UIApplication.didBecomeActiveNotification 的替代方法?
- java - 使用 Java Hibernate 和 JPA 建模友谊的最佳方法是什么
- javascript - JavaScript - 如何在变量中存储和使用函数的返回值
- javascript - "res.end" 不是 "res.on('end', () =>" (express.js) 中的函数
- java - 如何在 TextView 中反复更改点击单词的颜色 - Android Studio?
- webpack - 在监视模式和 Firebase 模拟器中使用 Webpack 时如何启用热重载:开始
- tensorflow - (TensorFlowLite Model Maker) ValueError: Expect x to be an non-empty array or dataset (Colab)
- r - Alert / notification in shiny