इस प्रश्न को SO पर संबोधित किया गया है, लेकिन वे सभी लोगों को body-parser का उपयोग करने के लिए कहते हैं।

मैं body-parser के बजाय एक्सप्रेस में बिल्ट-इन पार्सर का उपयोग करने की कोशिश कर रहा हूं, क्योंकि body-parser को एक्सप्रेस 4.x में फिर से जोड़ा गया था, इसलिए अब वे वही हैं।

हालाँकि मुझे HTML फॉर्म और पोस्टमैन दोनों पर multipart/form-data या x-www-urlencoded के साथ एक खाली req.body मिल रहा है (जिसके परिणामस्वरूप पासपोर्ट से "गलत उपयोगकर्ता नाम या पासवर्ड", लेकिन यह एक अलग मुद्दा है ):

const express = require('express');
require('dotenv');
const passport = require('passport');
const mongoose = require('mongoose')

const User = require('../models/user');

passport.initialize();
// CHANGE: USE "createStrategy" INSTEAD OF "authenticate"
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

require('mongoose-type-url');

//connect to database
mongoose.connect(process.env.DATABASE_URL,{
    useNewUrlParser:true, 
    useUnifiedTopology:true,
  useFindAndModify: false,
  useCreateIndex:true
}).then(() => {
    console.log('Connected to Mongo DB');
}).catch(err => {
    console.log('Mongoose error: ',err);
});
 
const app = express();
/* This is where npx express-generator automatically created the 'app.use' 
lines for the input parsers, both for json and urlencoded. 
I haven't touched this, it should be working just fine */
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(require('cookie-parser')());
app.use(require('express-session')({
  secret:"more things in the world",
  resave: false,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
 
app.post('/login', testPostLogin);

// POST /login
async function testPostLogin(req, res, next) {
  const {username, password } = req.body;
  const { user, error } = await User.authenticate()(username, password);
  if(!user && error) {
      return next(error);
  }
  req.login(user, function (err) {
      if(err){
          return next(err);
      }
      req.session.success = `Welcome back, ${username}`;
      /*if they came to the login page from somewhere that called 'isLoggedIn', 
      send them back there after logging in, then remove the hook to do that */
      const redirectUrl = req.session.redirectTo || '/';
      delete req.session.redirectTo;
      res.redirect(redirectUrl);
  });
}

let port = process.env.PORT;
if (port == null || port == "") {
  port = 8080;
}
app.listen(port, () => {
    console.log("server has started, listening on port "+port);
});

डाकिया कर्ल:

curl --location --request POST 'http://127.0.0.1:8080/login' \
--header 'Cookie: connect.sid=s%3A0aRKbFHVGSiUk-53HCZjuHKqYFAHIV7j.H9SDAJEDwY4rla2K%2BQ7ejiIJCMekMvhyeU8IH1sIh%2BE' \
--form 'username="bob"' \
--form 'password="password"'

क्या मुझे अपने सेटअप में कुछ स्पष्ट याद आ रहा है जो एक्सप्रेस को POST अनुरोध के मुख्य भाग को पार्स करने से रोक रहा है?

अद्यतन 2021-01-26 16:04 सीएसटी: मैंने body-parser में सबबिंग करने की कोशिश की, यह देखने के लिए कि क्या होगा, और अभी भी शून्य है। तो क्या यह मुद्दा है कि मार्ग पर मिडलवेयर को नहीं बुलाया जा रहा है? क्या इसका मतलब यह है कि मेरी आवश्यकताओं के क्रम में कुछ गड़बड़ है?

0
R Greenstreet 26 जिंदा 2021, 23:36

2 जवाब

सबसे बढ़िया उत्तर

यदि आप बॉडी-पार्सर प्रलेखन पढ़ते हैं तो यह संभव नहीं है, आपको तृतीय पक्ष मॉड्यूल का उपयोग करना चाहिए

यह उनके जटिल और आम तौर पर बड़े स्वभाव के कारण, बहुखण्डीय निकायों को संभाल नहीं पाता है। मल्टीपार्ट निकायों के लिए, आपको निम्नलिखित मॉड्यूल में रुचि हो सकती है:

बसबॉय और कनेक्ट-बसबॉय, मल्टीपार्टी और कनेक्ट-मल्टीपार्टी, दुर्जेय, मल्टर

यदि आपका फ़ॉर्म कोई वास्तविक multipart जानकारी नहीं भेज रहा है, केवल पाठ, express.urlencoded() को application/x-www-form-urlencoded हेडर के साथ भेजे जाने पर इसे पार्स करने में सक्षम होना चाहिए

1
R Greenstreet 27 जिंदा 2021, 21:46

दुर्जेय समाधानों के अलावा, एक और मॉड्यूल है जिसका उपयोग मैं 2019 से अपनी हालिया परियोजनाओं में कर रहा हूं। मॉड्यूल एक्सप्रेस-फॉर्म-डेटा को आपकी सर्वर फ़ाइल में आसानी से घोषित किया जा सकता है जैसे:

const formData = require('express-form-data');
app.use(formData.parse());

async function testPostLogin(req, res, next) {
  const {username, password } = req.body;
}

उपरोक्त x-www-form-urlencoded और json के साथ काम करेगा लेकिन यह किसी भी multipart के साथ काम नहीं करेगा। form-data हेडर multipart/form-data के साथ मल्टीपार्ट भी है।

0
mohammad javad ahmadi 27 जिंदा 2021, 00:09