如何在不同文件中使用带有路由的 TypeScript、Express 和 Node 获取 req.body 数据

How to get req.body data using TypeScript, Express and Node with Routes in different files

几天来我一直在尝试回答这个问题,通过 Whosebug、网络进行搜索,甚至多次重建这个问题。

我正在尝试使用 TypeScript 设置一个 Express 应用程序来创建 RESTApi,我想将我的路由和控制器保存在单独的文件中,以便我可以对其进行组织。

如果这不是最好的方法,我愿意接受其他建议。

我遇到的问题是,如果我输出 req.body,它会吐出已发送的 JSON,但如果我尝试访问 req.body['order_key'] or req.body.order_key,我们会得到 undefined

我做错了什么? :)

index.ts

import * as functions from 'firebase-functions';
import express from 'express';
// import * as bodyParser from 'body-parser';
import orderRoutes from './routes/orderRoutes';
// import {getAllOrders, updateOrder} from './orderController';

const app = express();

app.use(express.json());
// app.use(bodyParser.json()); // tried
// app.use(bodyParser.urlencoded({ extended: true })); // tried
app.use(express.urlencoded({extended: true}));

app.use('/orders', orderRoutes);

app.get('/', (req, res) => res.status(200).send('Hey there!'));

// handle orders
// app.get('/orders', getAllOrders);
// app.post('/orders', updateOrder);

exports.app = functions.https.onRequest(app);

我已经尝试使用 bodyParser,内置的解析器,所有解析器都可以让它工作

orderRoutes.ts

import {Router} from 'express';
import {getAllOrders, updateOrder} from '../controllers/orderController';
// eslint-disable-next-line new-cap
const router = Router();

router.route('/').post(updateOrder);
router.route('/').get(getAllOrders);

export default router;

orderController.ts

import {Request, Response} from 'express';

const getAllOrders = (req: Request, res: Response) => {
  res.status(200).send({
    status: 'success',
    message: 'Welcome',
  });
};

const updateOrder = async (req: Request, res: Response) => {
  res.status(200).send({
    status: 'success',
    message: 'Order created',
    data: 'data ' + req.body['order_key'] + req.body.order_key, // THIS IS THE ISSUE COMES UP UNDEFINED
  });
};

export {getAllOrders, updateOrder};

所有其他路由都有效,这是我发送的有效载荷:

[
    {
        "id": 26442,
        "parent_id": 0,
        "customer_id": 1489,
        "order_key": "wc_order_DQSfOIyzobd4k"
    }
]

使用邮递员,我将其设为 RAW 并打开 JSON,下面是屏幕截图

Post 问题

Post issue

Headers

Headers

感谢任何帮助

好吧,您的负载是一个数组,其中包含一个对象。如您所见:

[
    {
        "id": 26442,
        "parent_id": 0,
        "customer_id": 1489,
        "order_key": "wc_order_DQSfOIyzobd4k"
    }
]

开头和结尾的括号表示一个数组。如果您真的打算将有效载荷作为一个数组,那么您需要使用 req.body[0] 来访问该数组中的第一个对象。

或者,req.body[0].order_key获取密钥。

或者,如果要处理多个对象(如果数组中有多个对象),则可以使用 for 循环遍历数组中的对象。


或者,如果 API 真的只是应该发送一个对象,那么修复 client-side 以便您只发送一个对象的 JSON 版本:

{
    "id": 26442,
    "parent_id": 0,
    "customer_id": 1489,
    "order_key": "wc_order_DQSfOIyzobd4k"
}