this
ссылается на закрытие function(snapshot) {...}
в вашем случае.
Самый простой способ - определить parent
вне закрытия, а затем использовать parent
вместо this
:
require('dotenv').config();
const { RESTDataSource } = require('apollo-datasource-rest')
import firebaseInitialize from '../../firebase_initialize'
const firebase = firebaseInitialize()
class PlanData extends RESTDataSource {
constructor() {
super()
this.baseURL = 'https://api.com/'
this.getPlanById = this.getPlanById.bind(this)
}
willSendRequest(request) {
console.log(this.context.headers)
request.headers.set('Auth', this.context.headers.authorization);
}
planReducer(data) {
return {
id: data.plan.id,
image: data.plan.image,
title: data.plan.title
}
}
getPlanById = async ({ planId }) => {
const parent = this;
const db = firebase.database()
const ref = db.ref(`plans/${planId}`)
ref.once("value", function(snapshot) {
const data = snapshot.val()
return parent.planReducer(data)
}).catch((e) => {
console.log(e)
});
}
}
Однако, ваша строка return parent.planReducer(data)
, вероятно, также делает то, что вы не хотели, чтобы она делала: она просто возвращается в замыкании, а не функции getPlanById
.
ТакЧтобы решить эту проблему, используйте async/await
:
require('dotenv').config();
const {RESTDataSource} = require('apollo-datasource-rest')
import firebaseInitialize from '../../firebase_initialize'
const firebase = firebaseInitialize()
class PlanData extends RESTDataSource {
constructor() {
super();
this.baseURL = 'https://api.com/';
this.getPlanById = this.getPlanById.bind(this)
}
willSendRequest(request) {
console.log(this.context.headers);
request.headers.set('Auth', this.context.headers.authorization);
}
planReducer(data) {
return {
id: data.plan.id,
image: data.plan.image,
title: data.plan.title
}
}
getPlanById = async ({planId}) => {
const parent = this;
const db = firebase.database();
const ref = db.ref(`plans/${planId}`);
return await new Promise((resolve) => {
ref.once('value', function (snapshot) {
const data = snapshot.val();
resolve(parent.planReducer(data));
}).catch((e) => {
console.log(e);
// add some sensible error handling here
resolve(null);
});
});
}
}