Как отправить FormData из Node / Express в другое приложение (Node / Express) с помощью запроса - PullRequest
0 голосов
/ 13 мая 2019

У меня есть веб-сайт внешнего интерфейса (ejs и узел / экспресс) , работающий на локальном хосте: 8000 (если это помогает) и внутренний сервер (узел / экспресс) , работающий на локальном хосте:8010 (ps моя база данных находится в бэкэнде).Я пытаюсь реализовать Social login (fb, google и т. Д.) с использованием паспорта, и он отлично работает.Но я хочу сохранить учетные данные для входа в социальную сеть в базе данных (я использую mongoose) (которая, конечно, находится на / на внутреннем сервере) , и мое приложение Passport находится на внешнем интерфейсе (экспресс) Также все операции CRUD , которые я выполняю с веб-страницы , работают как шармЯ использую модуль запроса во внешнем интерфейсе для отправки http-запроса на внутренний сервер

Теперь я делаю следующее: Frontend Server -

passport.use(new FacebookStrategy({
    clientID: process.env.FB_CLIENT_ID || 'its a secret',
    clientSecret: process.env.FB_CLIENT_SECRET || 'its a secret',
    callbackURL: `${process.env.BASE_URL}/auth/callback/facebook` || '/auth/callback/facebook',
    profileFields: ['name', 'email', 'link', 'locale'],
    passReqToCallback: true
},  (req, accessToken, refreshToken, profile, cb) => {

        const form = new FormData();
        form.append('socialLogin', 'facebook');
        form.append('facebook', profile.id);
        form.append('accessToken', accessToken);
        form.append('avatar', `https://graph.facebook.com/${profile.id}/picture?type=large`);
        form.append('email', profile._json.email);
        form.append('username', `${profile.name.givenName}${profile.name.familyName}`);
        // const option = {
        //     socialLogin: 'facebook',
        //     facebook: profile.id,
        //     tokens: [{
        //         kind: 'facebook',
        //         accessToken
        //     }],
        //     avatar: `https://graph.facebook.com/${profile.id}/picture?type=large`,
        //     email: profile._json.email,
        //     username: `${profile.name.givenName} ${profile.name.familyName}`
        // };
        request({
            method: 'POST',
            dataType: 'JSON',
            url: process.env.BACKEND_URL + socialRoute + '/facebook',
            // data: option,
            data: form,
            headers: {
                'secret': 'its a secret',
                'authorization': true
            },
            contentType: false,
            processData: false
        }, function(error, response, 
            console.log('body', body);
            return cb(error, body);
        });
    }
));

(ps я также хотел показать вам, ребята, закомментированный код, т.е. переменную option. Даже это не сработало) Бэкэнд-сервер Маршрутизатор

const socialLoginCont = require('../controllers/socialLogin.cont');

router.post('/facebook', socialLoginCont.facebook);

(да, я использую экспресс-маршрутизатор) Контроллер

const formidable = require('formidable');
const User = require('../models/Users');

const facebook = async (req, res, next) => {
    const form = new formidable.IncomingForm();
    return form.parse(req, async (err, fields, files) => {
        res.send('it works from facebook: '+ fields);
    });
}
module.exports = {
   facebook 
   //, and more
}

Поскольку весь другой код на моем бэкэнд-сервере работает нормально, поэтому я не добавил никакого дополнительного кода, только ту часть, в которой мне нужна помощьПосле того, как я нажму на кнопку «Facebook», я получу это сообщение в своем терминале

[nodemon] watching: *.*
[nodemon] starting `node app.js`
Server started on port 8000
body it works facebook: [object object]
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`

Я даже попробовал его, используя Почтальон , и это вывод

it works from facebook[object Object]

Еслиi Выводим одно поле, оно показывает undefined т.е.

res.send(fields.socialLogin)

Если я вывожу несколько полей, оно показывает [объект объекта] то есть

res.send(fields)

Вот так, я думаю, если вы, ребята, не поняли, попробуйте добавить еще немного кода, но я надеюсь, что вы поймете суть того, что я пытаюсь сделать (я также искал ответ такого рода, но не нашел ни одного)

Пример Я пытаюсь сделать что-то вроде этого

passport.use(new FacebookStrategy({
  clientID: process.env.FACEBOOK_ID,
  clientSecret: process.env.FACEBOOK_SECRET,
  callbackURL: `${process.env.BASE_URL}/auth/facebook/callback`,
  profileFields: ['name', 'email', 'link', 'locale', 'timezone', 'gender'],
  passReqToCallback: true
}, (req, accessToken, refreshToken, profile, done) => {
  if (req.user) {
    User.findOne({ facebook: profile.id }, (err, existingUser) => {
      if (err) { return done(err); }
      if (existingUser) {
        req.flash('errors', { msg: 'There is already a Facebook account that belongs to you. Sign in with that account or delete it, then link it with your current account.' });
        done(err);
      } else {
        User.findById(req.user.id, (err, user) => {
          if (err) { return done(err); }
          user.facebook = profile.id;
          user.tokens.push({ kind: 'facebook', accessToken });
          user.profile.name = user.profile.name || `${profile.name.givenName} ${profile.name.familyName}`;
          user.profile.gender = user.profile.gender || profile._json.gender;
          user.profile.picture = user.profile.picture || `https://graph.facebook.com/${profile.id}/picture?type=large`;
          user.save((err) => {
            req.flash('info', { msg: 'Facebook account has been linked.' });
            done(err, user);
          });
        });
      }
    });
  } else {
    User.findOne({ facebook: profile.id }, (err, existingUser) => {
      if (err) { return done(err); }
      if (existingUser) {
        return done(null, existingUser);
      }
      User.findOne({ email: profile._json.email }, (err, existingEmailUser) => {
        if (err) { return done(err); }
        if (existingEmailUser) {
          req.flash('errors', { msg: 'There is already an account using this email address. Sign in to that account and link it with Facebook manually from Account Settings.' });
          done(err);
        } else {
          const user = new User();
          user.email = profile._json.email;
          user.facebook = profile.id;
          user.tokens.push({ kind: 'facebook', accessToken });
          user.profile.name = `${profile.name.givenName} ${profile.name.familyName}`;
          user.profile.gender = profile._json.gender;
          user.profile.picture = `https://graph.facebook.com/${profile.id}/picture?type=large`;
          user.profile.location = (profile._json.location) ? profile._json.location.name : '';
          user.save((err) => {
            done(err, user);
          });
        }
      });
    });
  }
}));

Это пример из https://github.com/sahat/hackathon-starter, где они хранят учетные данные в базе данных (легко)

1 Ответ

0 голосов
/ 13 мая 2019

Вам необходимо указать правильный тип контента в вашем коде, например «Content-Type»: «application / x-www-form-urlencoded» в заголовке, в настоящее время вы устанавливаете «contentType: false».также проверьте dataType: 'JSON', удалите его, если вы не уверены в возвращаемом контенте.см. эту ссылку для образца https://flaviocopes.com/node-http-post/

...