Я делал учебник по GraphQL с сервера Apollo. Сейчас пытаюсь добавить батчинг из этой части - https://www.apollographql.com/docs/apollo-server/features/data-sources/#batching
Я знаю, что могу использовать private в TypeScript. Но не уверен, как использовать в JS.
Насколько я искал, я установил два плагина Babel, class-properties и private-methods.
// .babelrc
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
],
"plugins": [
["@babel/plugin-proposal-class-properties", { "loose": true }],
["@babel/plugin-proposal-private-methods", { "loose": true }],
"@babel/plugin-proposal-object-rest-spread",
"@babel/plugin-proposal-async-generator-functions"
]
}
Вот код:
// datasource.js
import DataLoader from 'dataloader';
class PostAPI extends DataSource {
constructor({ knex }) {
super();
this.knex = knex;
}
initialize(config) {
this.context = config.context;
}
// ERROR HERE!
#postLoader = new DataLoader(ids =>
this.knex('posts')
.whereIn('id', ids)
.select()
.then(rows => ids.map(id => rows.find(x => x.id === id)))
);
async findAll() {
const posts = await this.knex('posts').select();
if (!posts.length) return [];
console.info(posts);
return posts;
}
async findOne({ id: idArg } = {}) {
/*
const post = await this.knex('posts')
.where('id', idArg)
.first();
*/
const post = await this.postLoader.load(idArg);
if (!post) return;
return post;
}
}
И это дает ошибку, когда я запрашиваю один пост (findOne):
{
"errors": [
{
"message": "Cannot read property 'load' of undefined",
}
]
}
Кроме того, eslint предупреждает, что # — это «недопустимый символ».
Вот мой .eslintrc:
// .eslintrc.json
{
"root": true,
"parser": "babel-eslint",
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2018,
"allowImportExportEverywhere": false,
"ecmaFeatures": {
"globalReturn": false
}
},
"plugins": ["babel"],
"extends": ["eslint:recommended", "prettier"],
"env": {
"browser": true,
"node": true,
"es6": true,
"jest": true
},
"rules": {},
"globals": {}
}
Пожалуйста помоги.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


# является частью названия поля. Поэтому вам нужно использовать # везде, где вы его используете:
const post = await this.#postLoader.load(idArg);
// ---------------------^
Вот простой пример использования частного поля (а также частного метода):
class Example {
#foo = 42;
publicMethod() {
console.info("From publicMethod:", this.#foo);
this.#privateMethod();
}
#privateMethod() {
console.info("From #privateMethod:", this.#foo);
}
}
const e = new Example();
console.info(e.publicMethod());
Also, eslint warns that # is 'Invalid character'.
Частные поля — это всего лишь предложение Этапа 3, еще не стандартизированное. У ESLint, похоже, нет возможности их поддерживать.