2017-02-02 7 views
1

私はすべての返信をreturnを使用していHapiJSは二回

Unhandled rejection Error: reply interface called twice 

注()インタフェース

Locations 
    .findOne({ 
     _id: request.params.id, 
     activationCode: payload.activationCode 
    }).then((location) => { 
     if (!location) { 
     return reply(Boom.notFound('Location not found')) 
     } 
     locationObject = location 
     if (payload.password !== payload.confirmPassword) { 
     return reply(Boom.badRequest('Password and Confirm Password must match')) 
     } 
     if (!payload.terms) { 
     return reply(Boom.badRequest('Must agree to Terms & Conditions')) 
     } 
     return newPaymentMethod.save() 
    }).then((paymentMethod) => { 
     ..... 
     return user.save() // user is defined at ..... 
    }).then(() => { 
     return reply({ token: helpers.createJwt(userObject) }) 
    }).catch((err) => { 
     return reply(Boom.wrap(err)) 
    }) 

どれでも役立つだろう以下のスニペットでこのエラーメッセージが出てい呼び出されている返信感謝する。

答えて

2

約束が誤って使用されているように見えるようです。 replyにアクセスできるルートハンドラ内でスニペットを実行していると思います。

あなたはreturn.then(約束)に約束チェーン、あなたの両方return値以内にご回答をすると、外側のスコープからreplyを呼び出している通り。

お約束のrejectをエラーとして使用することをお勧めします。これにより、約束の.catch()に1つのreply(Boom.method())が必要です。

0

あなたは

.then(() => { 
    return reply({ token: helpers.createJwt(userObject) }) 
}).catch((err) => { 
    return reply(Boom.wrap(err)) 
}) 

最後に約束をチェーンのでifの条件のいずれかに該当する場合は、二回replyを呼ぶかもしれません。 ifでエラーをスローするのは簡単な解決策です。つまり、キャッチブロックにはすでにBoom.wrapが存在するためです。