【问题标题】:Promises issue on github authentication using Everyauth使用 Everyauth 进行 github 身份验证的 Promise 问题
【发布时间】:2014-08-22 10:24:31
【问题描述】:

在我导航到 url.com/auth/github 并授权 github 后,我收到下面列出的错误,说我没有履行承诺,即使我在 App.js 中这样做了。

App.js:

var appPath = __dirname + '/app'
    , http = require('http')
    , path = require('path')
    , fs = require('fs')
    , everyauth = require('everyauth')


everyauth.github
  .appId('xxxxxxx')
  .appSecret('xxxxxxx')
  .findOrCreateUser( function (session, accessToken, accessTokenExtra, githubUserMetadata, promise) {

      var promise = this.Promise();

      var user = {
          name: githubUserMetadata.name,
          email: githubUserMetadata.email,
          username: githubUserMetadata.login,
          firstName: name.substring(0, name.indexOf(' ')),
          githubId: githubUserMetadata.id
      };


      app.User.findOne({githubId: githubUserMetadata.id }, function(err, user) {
        if (!user) {

        User.create(user, function userCreated(err, user){
            req.session.User = user;

        });
        promise.fulfill(user);

        }

      });
      return promise;


  })
  .redirectPath('/');

(我使用的框架是 Sailsjs,它应该使 User.create 成为可能?)

浏览器中的错误信息,不是终端(终端没有错误):

 Error: Step findOrCreateUser of `github` is promising: user ; however, the step returns
 nothing. Fix the step by returning the expected values OR by returning a Promise that
promises said values. at Step.exec (/app/node_modules/everyauth/lib/step.js:79:7) at
/app/node_modules/everyauth/lib/stepSequence.js:26:34 at Promise.fulfill
(/app/node_modules/everyauth/lib/promise.js:44:21) at
/app/node_modules/everyauth/lib/stepSequence.js:29:19 at Promise.callback
(/app/node_modules/everyauth/lib/promise.js:12:8) at
/app/node_modules/everyauth/lib/stepSequence.js:28:19 at Promise.fulfill
(/app/node_modules/everyauth/lib/promise.js:44:21) at
/app/node_modules/everyauth/lib/stepSequence.js:29:19 at Promise.fulfill
(/app/node_modules/everyauth/lib/promise.js:44:21) at
/app/node_modules/everyauth/lib/modules/github.js:50:9

感谢您的帮助!

【问题讨论】:

  • 我的猜测是 User.create 是异步的,promise.fulfill 不喜欢被无所事事地调用。
  • @Bergi 你的猜测是正确的。 promise.fulfill 需要进入 userCreated

标签: javascript node.js express sails.js everyauth


【解决方案1】:

我觉得应该是的

app.User.findOne({githubId: githubUserMetadata.id}, function(err, user) {
  if (err) {
    promise.fail(err);
  } else if (!user) {
    User.create(user, function userCreated(err, user){
      if (err) {
        promise.fail(err);
      } else {
        req.session.User = user;
        promise.fulfill(user);
      }
    });
  } else {
    promise.fulfill(user);
  }
});

不幸的是,这个库使用的 promise implementation 似乎缺少一些重要的特性,这些特性会使处理 Promise 变得更加容易。甚至不是interoperable :-(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2012-04-27
    • 2011-12-29
    • 2017-11-30
    • 2015-09-10
    • 2022-07-11
    • 1970-01-01
    相关资源
    最近更新 更多