@Anrek

Как фиксить ошибку при обращении к базе данных?

Здравствуйте!

Есть проект с гита на ноде со slonik (библиотека для взаимодействия с базой данных), я его запустил, смотрю как работает. Отправляю с Postman запросы ему - если просто на api - запрос работает, проблем нет. Если же требуется взаимодействие с базой данных, то выходит ошибка:

TypeError: slonik_1.sql.raw is not a function.

ранее я понизил версию slonik, потому что в этих же местах (с sql.raw) выходила другая ошибка: Property 'raw' does not exist on type. Там библиотека как-то странно ставилась и на интерфейс raw ссылка не делалась.

я гуглил ошибку "TypeError: slonik_1.sql.raw is not a function." - есть решение похожее здесь , но это или не мой случай или мне не хватает знаний и опыта подвести под свой случай. Там db.query предлагают заменить db.serialize.query. Я попробовал вместо:

slonik_1.sql.raw

сделать:
slonik_1.sql.serialize.raw

но это не помогло - мой код не знает типа serialize для sql.

Вопрос: что можно попробовать сделать чтобы зафиксить ошибку?

Дополнительная информация к вопросу:
1) О том что я делаю:
- Проект представляет из себя бекенд для мобильного приложения: обрабатывает запросы/принимает/отправляет данные. Я хочу разобраться как работает бек-энд. Для этого я на локальном хосте развернул и соединил его с БД Postgresql также на локальном сервере (хотя точной уверенности что соединение с БД налажено у меня нет, но ошибок по определению url БД не выходит). Т.к. мобильного приложения у меня нет, я использую в качестве клиента Postman.
- У бекенда есть файл Api, где обрабатываются запросы. Сначала я проверил GET запрос, просто вставив в файл Api обработку запроса прямо сразу с данными (чтобы не трогать БД) и с Postman отправил запрос на порт с приложением. Все ок, запрос вернулся, данные принес.
- Сейчас хочу протянуться глубже и достать до БД: составить Post запрос в Postman, чтобы бэкэнд его записал в базу данных. Но получаю в Postman в ответ на запрос записи данных ошибку "internal", а в visual studio code ошибку: TypeError: slonik_1.sql.raw is not a function.

2) Ошибка поподробнее:

Если подробнее, ошибка выглядит так (приложение при этом не вылетает):
TypeError: slonik_1.sql.raw is not a function
    at Object.getToken (C:\Users\user\Desktop\backend\dist\db.js:87:32)
    at C:\Users\user\Desktop\backend\dist\api.js:336:32
    at C:\Users\user\Desktop\backend\dist\api.js:278:30
    at Layer.handle [as handle_request] (C:\Users\user\Desktop\backend\node_modules\express\lib\router\layer.js:95:5)
    at next (C:Users\user\Desktop\backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\user\Desktop\backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\user\Desktop\backend\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:281:22   
    at Function.process_params (C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:275:10)
    at C:\Users\user\Desktop\backend\dist\api.js:68:5
    at Layer.handle [as handle_request] (C:\Users\user\Desktop\backend\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:284:7    
    at Function.process_params (C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\user\Desktop\backend\node_modules\express\lib\router\index.js:275:10)


3) cтек инструментов (из packege.json):
google_maps, sindresorhus/slugify, bcrypt, bcryptjs, body-parser, cors, cron, express, fcm-push, lodash, ms, node-fetch, pg, reflect-metadata, sendgrid, slonik, socket.io

сам бэкэнд на node js на ts.

4) общий вид кода:
кроме api - где идет обработка запросов (по принципу app.post('/someReq', function cheking mistakesAndToken, await db.doSomething) отдельно есть файл db, который импортируется в api.

app это
export const app = Express();
bd это
файл с функциями обращения к базе данных при помощи slonik.

5) места где ошибка поподробнее:

ошибки вида:
Property 'raw' does not exist on type 'SqlTaggedTemplateType'.;

почти везде в местах сочленения sql c чем-либо (sql отсюда: import { createPool, sql } from 'slonik'). Если понизить версию слоника - ошибки уйдут - но на результатах запроса POST из Postman это никак не отразится (и в Postman и в Visual Studuo).

Примеры строк где ошибки:
const escapeNames = (names: string[]) => sql.raw(names.map(x => escapeName(x).sql).join(', ')); //(raw - подчеркивается)

const svalue = value => sql.valueList([value]); //(valueList- подчеркивается)

function _insert(obj) {
  const schema = Schema.get(obj);
  const keys = schema.cols.map(x => x[0]).filter(x => !schema.serials.includes(x));
  return sql`
    INSERT INTO ${escapeName(schema.name)} (${escapeNames(keys)})
      VALUES ${sql.tuple(keys.map(x => obj[x]))}
  `;//(.tuple - подчеркивается)
}
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
@Anrek Автор вопроса
Нашел решение: почитал про slonik и его версии, выяснил, что заменили выражения, в которых у меня возникала ошибка как указано тут:
sql.raw
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Это вопрос не про Postgresql, тут даже уцепиться не за что. Slonik - это командная оболочка для Slony-I из того, что мне известно. Тут, видимо, другой слоник какой-то.
Причем здесь Postman, api, кто такой db.query/db.serialize.query - неведомо.
Опишите стек инструментов, которым пользуетесь, последовательность действий, код покажите.
И поставьте теги (если это гребаный sequelize, поставьте Node.js)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы