Javascript 如何在特定快车路线上设置不同的bodyparser

Javascript 如何在特定快车路线上设置不同的bodyparser,javascript,node.js,json,express,Javascript,Node.js,Json,Express,我用的是express 4 在我的server.js中有express.json()中间件 require('dotenv').config(); const express = require('express'); const cors = require('cors'); const mongoose = require('mongoose'); const errorHandler = require('./_helpers/error-handler'); const app =

我用的是express 4

在我的server.js中有express.json()中间件

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');
const errorHandler = require('./_helpers/error-handler');



const app = express();

const port = process.env.PORT || 5000;


app.use(cors());
app.use(express.json()); /////////////////////////////////////////


const uri = process.env.ATLAS_URI;
mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true, useFindAndModify: true});
const connection = mongoose.connection;
connection.once('open', () => {
    console.log("MongoDB database connection established successfully");
});

// routers
app.use('/api/users', require('./routes/api/users/users.controller'));
app.use('/api/orders', require('./routes/api/orders/orders.controller'));
app.use('/shopify/app', require('./routes/shopify/app/shopify.controller'));
app.use('/shopify/app/webhooks', require('./routes/shopify/app/webhooks/webhooks.controller')); ///////////////

app.use(errorHandler);

app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});
但对于
“/shopify/app/webhooks”
路线,我需要获得原始主体,以便创建散列 但到目前为止,我接收对象是因为我有express.json()中间件

这是我的webhooks.controller.js文件

const express = require('express');
const router = express.Router();
const crypto = require('crypto')

const SHOPIFY_API_SECRET_KEY = process.env.SHOPIFY_API_SECRET_KEY;
// router.use(express.raw({ type: "application/json"}));

// routes goes here
router.post('/app/uninstalled', express.raw({ type: 'application/json' }), async (req, res, next) => {
    
    const hmac = req.get('X-Shopify-Hmac-Sha256')
    console.log(req.body);
    // create a hash using the body and our key
    const hash = crypto
        .createHmac('sha256', SHOPIFY_API_SECRET_KEY)
        .update(req.body, 'utf8', 'hex')
        .digest('base64')

    // Compare our hash to Shopify's hash
    if (hash === hmac) {
        // It's a match! All good
        console.log('Phew, it came from Shopifify!')
        res.sendStatus(200)
    } else {
        // No match! This request didn't originate from Shopify
        console.log('Danger! Not from Shopify!')
        res.sendStatus(403)
    }
    
})
我在webhooks.controller.js
router.use(express.raw({type:“application/json”}))
我想既然我正在接收json对象,我就可以使用接受json的express.raw()中间件
但它仍然不起作用。

您必须将此路由放在
应用程序之前。使用(express.json())
中间件,然后您可以将原始中间件直接应用于该路由:

app.use('/shopify/app/webhooks', express.raw({/* put your options here */}), require('./routes/shopify/app/webhooks/webhooks.controller'));

请记住,这行代码必须在您的
express.json()
中间件之前执行。

Hi@jfriend00我想知道,因为我只需要原始体来创建哈希来验证其来源。我可以使用
express.json({verify:(req,res,buf,encoding)=>{//usebuf创建散列,如果它被验证,那么next()否则抛出异常}))
并且使用这种方法req.body将是json对象,对吗?@AhmetK-我不知道-从未尝试过使用该配置。