Help us understand the problem. What is going on with this article?

loopback-passportを使う時に「The model type must be a constructor」が出た話

More than 5 years have passed since last update.

Node.js loopback-passport (loopback-component-passport) を使おうとして、下記のようなエラーがでた。

assert.js:93
  throw new assert.AssertionError({
        ^
AssertionError: The model type must be a constructor
    at Function.registry.getModelByType (***/node_modules/loopback/lib/registry.js:286:3)
    at PassportConfigurator.setupModels (***/node_modules/loopback-component-passport/lib/passport-configurator.js:32:50)
    at Object.<anonymous> (***/server/server.js:26:22)   
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3

そもそも、loopback-passportにはloopback-example-passportとして使用例が用意されていて、当然試しました。
上記のエラーは改めて自分で作ってみようとした時に起きたエラーです。

Node.jsのことを十分に理解していない状態で触っているので、これがのせいじゃないのという気もしていますが。。。

エラーメッセージでググると、loopback-example-passportのissuesで下記のようなのも引っかかります。
Node.jsのお作法を知っていれば、sourcesに設定するものが足りないというパターンが多いのではないでしょうか。。
https://github.com/strongloop/loopback-example-passport/issues/25

自分の場合はこのパターンではなく、Node.jsのお作法の問題でした。
結論からいうと、下記を欠いていただけ。

server.js
var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();

// Passport configurator                                                                              
var loopbackPassport = require('loopback-component-passport');
var PassportConfigurator = loopbackPassport.PassportConfigurator;
var passportConfigurator = new PassportConfigurator(app);

...

//忘れてたのはこれ↓
boot(app, __dirname);

...

//Initialize passport                                                                                 
passportConfigurator.init();

//エラーが出てるのはここ↓
passportConfigurator.setupModels({
    userModel: app.models.user,
    userIdentityModel: app.models.userIdentity,
    userCredentialModel: app.models.userCredential
});

Node.js 1.x系では、app.boot(__dirname)としていた部分。
2.x系からはプロジェクト別れたようです。
Loopbackの初期化(initialize/bootstrap)をする仕事をしてくれています。

ちなみに、__dirname は、nodeを起動する時のcurrentを指しているところを取得します。(docはこちら)

source設定を有効にするにも、これが必要だった、ということでしょうか。

ちなみに、Third-party loginの説明として、ここには1.x系の説明で書いてあります。
サンプルを2.x系で実行すると、こんな形でエラー出ました。
(まんま、メッセージに書いてある。親切ですねー。)

***/node_modules/loopback/lib/application.js:360
  throw new Error(
        ^
Error: `app.boot` was removed, use the new module loopback-boot instead
    at EventEmitter.app.boot (***/node_modules/loopback/lib/application.js:360:9)
    at Object.<anonymous> (***/server/server.js:22:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:929:3
yosi-q
インド資本の入った米国クラウドコンサルティングファームの東京オフィスに所属し、山形県鶴岡市からリモートワークしながら、ちょっとしたwonder探ししてます。 Qiitaは記録も含めてやったことをちょこちょこ残しています。 ここで記載した記事は私感や私自身の実施した内容の記録として記載しており、所属する組織とは関係ありません。
http://yosi-q.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away