如何解决Node JS Clean体系结构无法返回响应
请尝试为我的node js rest API实现一个干净的体系结构,我研究了一个教程 Using Clean Architecture for Microservice APIs in Node.js with MongoDB and Express ...我的目标是适应HTTP请求并将控制器作为函数调用并返回响应
server.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.' })
);
};
}
register.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.' });
}
如果其他都没问题,应该可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。