首页 > 解决方案 > 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`


标签: javascriptnode.jsexpressmicroservicesclean-architecture

解决方案


在 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.' });
}

如果其他一切都很好,应该可以工作。


推荐阅读