Estou trabalhando com a API que servirá como minha camada de acesso a dados na arquitetura do meu projeto.
Esta é a forma original da minha configuração de consulta de API:
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query('EXEC testStoredProcedure @user_id, @img_data, @img_size, @birthday, @country, @email_add, @mobile_no, @key');
Funciona bem com essa configuração.
No entanto, se houver mais parâmetros do que o esperado, quero melhorar a legibilidade da consulta da API com os mesmos resultados.
Então eu uso essas abordagens usando variáveis e acentos graves :
com req.body.[param]
const query = `
'EXEC testStoredProcedure
@user_id = ${req.body.user_id},
@img_data = ${req.body.img_data},
@img_size = ${req.body.img_size},
@birthday = ${req.body.birthday},
@country = ${req.body.country},
@email_add = ${req.body.email_add},
@mobile_no = ${req.body.mobile_no},
@key = ${req.body.key}'
`;
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query(query);
sem req.corpo
const query = `
'EXEC testStoredProcedure
@user_id = ${user_id},
@img_data = ${img_data},
@img_size = ${img_size},
@birthday = ${birthday},
@country = ${country},
@email_add = ${email_add},
@mobile_no = ${mobile_no},
@key = ${key}'
`;
const pool = await poolPromise;
const request = pool.request();
const result = await request.input('user_id', sql.NVarChar(50), user_id || null)
.input('img_data', sql.VarBinary(sql.MAX), Buffer.from(img_data))
.input('img_size', sql.Decimal(10, 3), img_size)
.input('birthday', sql.Date, birthday)
.input('country', sql.VarChar(200), country)
.input('email_add', sql.NVarChar(150), email_add)
.input('mobile_no', sql.VarChar(50), mobile_no)
.input('key', sql.VarChar(100), key)
.query(query);
Ambos falham ao processar a solicitação por meio desta chamada de API do meu projeto Flutter:
await _api.testMethod(
'/api/request', // route
null, // user_id
'', // img_data
0.00, // img_size
DateTime.now().toIso8601String(), // birthday
'Philippines', // country
null, // email_add
_mobileNo, // mobile_no
'SIGN_IN'); // key
Isto é o que os logs dizem para comreq.body.[param]
e semreq.body.[param]
:
Exceção não capturada: Exceção: Falha ao fazer solicitação POST: Exceção: Erro de API: 500 {mensagem: Sintaxe incorreta perto de 'EXEC testStoredProcedure @user_id = null, @img_data = '', '.}
De acordo com os logs, a sintaxe near especificando o parâmetro for EXEC testStoredProcedure
está incorreta. Portanto, o que estou perdendo aqui?
Se nenhuma das abordagens tentadas funcionar, mesmo que haja uma solução alternativa.
Aqui está a solução que melhora a legibilidade e também fornece os mesmos resultados:
Substitua este trecho de código:
com este trecho de código:
Você notará que
req.body
as variáveis são removidas e descobri que as aspas simples ( ' ) causam a exceção de sintaxe incorreta .Editar: otimizar a estrutura da função do controlador da API
Este trecho de código introduz uma configuração inadequada:
e deve ser refatorado em:
Remova a variável de consulta porque ela é redundante, refatore-a
.query(query)
e altere-a para.execute('testStoredProcedure')
.Espero que ajude os futuros leitores! ;)