Я пытаюсь написать API, чтобы по существу принять учетные данные пользователя и вернуть хешированную ценность с цифровым сертификатом. Я создал API с node.js и почтальником, чтобы создать JSON, с которым я могу манипулировать данными и использовать их для других интерфейсов API. Я получаю следующую ошибку < /p>
SyntaxError: Unexpected end of JSON input
application.js:617
at JSON.parse ()
application.js:617
at createStrictSyntaxError (C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\types\json.js:156:10)
application.js:617
at parse (C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\types\json.js:71:15)
application.js:617
at C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\read.js:123:18
application.js:617
at AsyncResource.runInAsyncScope (node:async_hooks:214:14)
application.js:617
at invokeCallback (C:\Users\fram\Desktop\August_26\node_modules\raw-body\index.js:238:16)
application.js:617
< /code>
Тело запроса показывает пусто для одного из моих сообщений, но два других посты возвращают хорошие данные в журнале консоли (Certjson). К сожалению, мой вывод My Body JSON - это HTML, отображающий вышеуказанное сообщение об ошибке. Я полагаю, что я ищу синтаксисную ошибку в своем коде, но я не могу ее найти, как и компиляторы в VS Studio и Postman Web. Я был бы признателен за любую помощь в решении этого.
// server.js
import express from "express";
import cors from "cors";
import { ethers } from "ethers";
//dummy key
const SP_PRIVATE_KEY = process.env.SP_PRIVKEY || "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
const SIGNER = new ethers.Wallet(SP_PRIVATE_KEY);
// EIP-712 domain and types
const domain = {
name: "SPCertificate",
version: "1",
chainId: 1,
verifyingContract: "0x0000000000000000000000000000000000000000"
};
const types = {
Certificate: [
{name: "userId", type:"bytes32"},
{name: "dln", type:"string"},
{name: "audience", type:"string"},
{name: "nonce", type:"bytes32" },
{name: "issuedAt", type:"uint64"},
{name: "exp", type:"uint64"}
]
};
const app = express();
app.use(cors());
app.use(express.json());
// Utility: random 32-byte hex
function randBytes32() {
return ethers.hexlify(ethers.randomBytes(32));
}
// POST /cert/issue construction and check { dln, secret_hash, audience }
app.post("/cert/issue", async (req, res) => {
try {
const {dln,secret_hash,audience="SP:DEMO"} = req.body || {};
if (!dln || !secret_hash) {
return res.status(400).json({error:"Missing dln or secret_hash"});
}
// Basic input string regular expression (regex) checks
if (typeof dln !== "string" || !/^[-A-Za-z0-9]{5,}$/.test(dln)) {
return res.status(400).json({ error: "Invalid dln format" });
}
if (!ethers.isHexString(secret_hash, 32)) {
return res.status(400).json({ error: "secret_hash must be 0x + 32-byte hex" });
}
const now = Math.floor(Date.now() / 1000);
const exp = now + 60 * 60 * 24 * 7; // 7 days validity
const cert = {userId: randBytes32(), dln, audience, nonce: secret_hash, issuedAt: now, exp};
const signature = await SIGNER.signTypedData(domain, types, cert);
return res.json({cert, signature, signer: SIGNER.address, domain, types});
} catch (e) {
console.error(e);
res.status(500).json({ error: "internal_error" });
}
});
// POST /cert/verify construction { cert, signature, expectedSigner? }
app.post("/cert/verify", async (req, res) => {
try {
const { cert, signature, expectedSigner } = req.body || {};
if (!cert || !signature) {
return res.status(400).json({ok:false, error: "Missing cert or signature"});
}
const recovered = ethers.verifyTypedData(domain, types, cert, signature);
const ok = expectedSigner ? (recovered.toLowerCase() === expectedSigner.toLowerCase()) : true;
return res.json({ok, recovered,expected: expectedSigner || null });
} catch (e) {
console.error(e);
res.status(400).json({ok:false,error: "verify_failed" });
}
});
const port = process.env.PORT || 10533;
app.listen(port, () => {
console.log(`SP demo listening on http://localhost:${port}`);
console.log(`Signer address: ${SIGNER.address}`);
});
< /code>
У меня есть файл предварительного запроса в почте, который выглядит так. < /p>
const secret = pm.environment.get("user_secret");
const dln = pm.environment.get("dln");
const spBase = pm.environment.get("sp_base");
const crypto = pm.require('npm:crypto-js@4.2.0');
if (!secret || !dln || !spBase) {
throw new Error("Missing env vars: user_secret, dln, sp_base");
}
const sha = crypto.SHA256(crypto.enc.Utf8.parse(secret));
const secretHashHex = "0x" + sha.toString(crypto.enc.Hex);
pm.environment.set("secret_hash", secretHashHex);
const url = spBase + "/cert/issue";
const body = {dln: dln,secret_hash:secretHashHex, audience:"SP:DEMO"};
pm.sendRequest({url, method:"POST",header: [{key:"Content-Type",value:"application/json"}],
body: {mode:"raw",raw:JSON.stringify(body)}
}, function (err, resp) {
try {
if (err) {
console.log("Issue error:", err);
throw err;
}
if (resp.code !== 200) {
console.log("Issue failed:", resp.text());
throw new Error("SP issue endpoint failed");
}
const data = resp.json();
// Check if data and cert exist
if (data && data.cert) {
pm.environment.set("cert_json", JSON.stringify(data.cert));
pm.environment.set("signature", data.signature);
pm.environment.set("sp_signer", data.signer);
pm.environment.set("cert_userId", data.cert.userId);
pm.environment.set("cert_dln", data.cert.dln);
pm.environment.set("cert_exp", data.cert.exp.toString());
console.log("Cert and signature set successfully");
} else {
throw new Error("Invalid response structure: " + JSON.stringify(data));
}
}
catch (e) {
console.error("An error occurred:", e);
}
});
< /code>
Тогда у меня есть тесты (пост ответ), которые в основном представляют собой проверки формата JSON и выглядят так: < /p>
const spBase = pm.environment.get("sp_base");
const certJson = pm.environment.get("cert_json");
const signature = pm.environment.get("signature");
const spSigner = pm.environment.get("sp_signer");
//console.log("certJson is " + certJson);
pm.test("Cert and signature exist", function () {
pm.expect(certJson).to.be.a("string");
// Updated regex to ensure signature matches expected format
pm.expect(signature).to.match(/^0x[0-9a-fA-F]{130}$/);
});
const verifyReq = {
url: spBase + "/cert/verify",
method: "POST",
header: [{ key: "Content-Type", value: "application/json" }],
body: { mode: "raw", raw: JSON.stringify({ cert: JSON.parse(certJson), signature: signature, expectedSigner: spSigner})}
};
pm.sendRequest(verifyReq, function (err, resp) {
pm.test("Verify endpoint responded", function () {
pm.expect(err).to.be.null;
pm.expect(resp).to.have.property("code", 200);
});
const data = resp.json();
pm.test("Signature is valid", function () {
pm.expect(data.ok).to.eql(true);
pm.expect((data.recovered || "").toLowerCase()).to.eql((spSigner || "").toLowerCase());
});
});
< /code>
Пожалуйста, проверьте мой код PM.SendRequest на наличие потенциальных ошибок. Один из моих сообщений возвращает 400 ошибок от ответа на 400, так что это можно было запустить внутри Server.js, но я не уверен. Это пост, который, по -видимому, генерируется почтальником, а не моими сценариями. < /P>
В консоли появляются три сообщения. Я вижу вывод в консольном журнале, который выглядит действительным для двух из этих сообщений (CertJson), я проверил этот вывод JSonLint, и он хороший JSON, но он в журнале консоли! не тело сообщения. Как упомянуто выше второго поста в списке трех, содержит тело ответа с вышеуказанным HTML (код ошибки), и ни один JSON никогда не появляется в области тела почтальона. Мой тип контента установлен на Application.json, а URL SP_BASE правильно показывает адрес локального хоста. Я начну с трех переменных вручную, настроенной вручную, DLN, user_secret (который в конечном итоге станет большим прайм) и SP_BASE (LocalHost: 10533, согласно агенту почтальона). Затем Server.js создает больше учетных данных. Однако я пытаюсь решить эту ошибку вывода JSON, которая отказывается разбираться в теле сообщения. Любая помощь с благодарностью получена. Пожалуйста, ищите синтаксические ошибки в соответствии с сообщением об ошибке. Я использую Firefox в качестве браузера для почтовой сети.
Подробнее здесь: https://stackoverflow.com/questions/797 ... d-javascri
«Неожиданный конец ввода JSON на json.parse» ошибка API с почтальником и JavaScript [закрыто] ⇐ Javascript
Форум по Javascript
1757681622
Anonymous
Я пытаюсь написать API, чтобы по существу принять учетные данные пользователя и вернуть хешированную ценность с цифровым сертификатом. Я создал API с node.js и почтальником, чтобы создать JSON, с которым я могу манипулировать данными и использовать их для других интерфейсов API. Я получаю следующую ошибку < /p>
SyntaxError: Unexpected end of JSON input
application.js:617
at JSON.parse ()
application.js:617
at createStrictSyntaxError (C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\types\json.js:156:10)
application.js:617
at parse (C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\types\json.js:71:15)
application.js:617
at C:\Users\fram\Desktop\August_26\node_modules\body-parser\lib\read.js:123:18
application.js:617
at AsyncResource.runInAsyncScope (node:async_hooks:214:14)
application.js:617
at invokeCallback (C:\Users\fram\Desktop\August_26\node_modules\raw-body\index.js:238:16)
application.js:617
< /code>
Тело запроса показывает пусто для одного из моих сообщений, но два других посты возвращают хорошие данные в журнале консоли (Certjson). К сожалению, мой вывод My Body JSON - это HTML, отображающий вышеуказанное сообщение об ошибке. Я полагаю, что я ищу синтаксисную ошибку в своем коде, но я не могу ее найти, как и компиляторы в VS Studio и Postman Web. Я был бы признателен за любую помощь в решении этого.
// server.js
import express from "express";
import cors from "cors";
import { ethers } from "ethers";
//dummy key
const SP_PRIVATE_KEY = process.env.SP_PRIVKEY || "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
const SIGNER = new ethers.Wallet(SP_PRIVATE_KEY);
// EIP-712 domain and types
const domain = {
name: "SPCertificate",
version: "1",
chainId: 1,
verifyingContract: "0x0000000000000000000000000000000000000000"
};
const types = {
Certificate: [
{name: "userId", type:"bytes32"},
{name: "dln", type:"string"},
{name: "audience", type:"string"},
{name: "nonce", type:"bytes32" },
{name: "issuedAt", type:"uint64"},
{name: "exp", type:"uint64"}
]
};
const app = express();
app.use(cors());
app.use(express.json());
// Utility: random 32-byte hex
function randBytes32() {
return ethers.hexlify(ethers.randomBytes(32));
}
// POST /cert/issue construction and check { dln, secret_hash, audience }
app.post("/cert/issue", async (req, res) => {
try {
const {dln,secret_hash,audience="SP:DEMO"} = req.body || {};
if (!dln || !secret_hash) {
return res.status(400).json({error:"Missing dln or secret_hash"});
}
// Basic input string regular expression (regex) checks
if (typeof dln !== "string" || !/^[-A-Za-z0-9]{5,}$/.test(dln)) {
return res.status(400).json({ error: "Invalid dln format" });
}
if (!ethers.isHexString(secret_hash, 32)) {
return res.status(400).json({ error: "secret_hash must be 0x + 32-byte hex" });
}
const now = Math.floor(Date.now() / 1000);
const exp = now + 60 * 60 * 24 * 7; // 7 days validity
const cert = {userId: randBytes32(), dln, audience, nonce: secret_hash, issuedAt: now, exp};
const signature = await SIGNER.signTypedData(domain, types, cert);
return res.json({cert, signature, signer: SIGNER.address, domain, types});
} catch (e) {
console.error(e);
res.status(500).json({ error: "internal_error" });
}
});
// POST /cert/verify construction { cert, signature, expectedSigner? }
app.post("/cert/verify", async (req, res) => {
try {
const { cert, signature, expectedSigner } = req.body || {};
if (!cert || !signature) {
return res.status(400).json({ok:false, error: "Missing cert or signature"});
}
const recovered = ethers.verifyTypedData(domain, types, cert, signature);
const ok = expectedSigner ? (recovered.toLowerCase() === expectedSigner.toLowerCase()) : true;
return res.json({ok, recovered,expected: expectedSigner || null });
} catch (e) {
console.error(e);
res.status(400).json({ok:false,error: "verify_failed" });
}
});
const port = process.env.PORT || 10533;
app.listen(port, () => {
console.log(`SP demo listening on http://localhost:${port}`);
console.log(`Signer address: ${SIGNER.address}`);
});
< /code>
У меня есть файл предварительного запроса в почте, который выглядит так. < /p>
const secret = pm.environment.get("user_secret");
const dln = pm.environment.get("dln");
const spBase = pm.environment.get("sp_base");
const crypto = pm.require('npm:crypto-js@4.2.0');
if (!secret || !dln || !spBase) {
throw new Error("Missing env vars: user_secret, dln, sp_base");
}
const sha = crypto.SHA256(crypto.enc.Utf8.parse(secret));
const secretHashHex = "0x" + sha.toString(crypto.enc.Hex);
pm.environment.set("secret_hash", secretHashHex);
const url = spBase + "/cert/issue";
const body = {dln: dln,secret_hash:secretHashHex, audience:"SP:DEMO"};
pm.sendRequest({url, method:"POST",header: [{key:"Content-Type",value:"application/json"}],
body: {mode:"raw",raw:JSON.stringify(body)}
}, function (err, resp) {
try {
if (err) {
console.log("Issue error:", err);
throw err;
}
if (resp.code !== 200) {
console.log("Issue failed:", resp.text());
throw new Error("SP issue endpoint failed");
}
const data = resp.json();
// Check if data and cert exist
if (data && data.cert) {
pm.environment.set("cert_json", JSON.stringify(data.cert));
pm.environment.set("signature", data.signature);
pm.environment.set("sp_signer", data.signer);
pm.environment.set("cert_userId", data.cert.userId);
pm.environment.set("cert_dln", data.cert.dln);
pm.environment.set("cert_exp", data.cert.exp.toString());
console.log("Cert and signature set successfully");
} else {
throw new Error("Invalid response structure: " + JSON.stringify(data));
}
}
catch (e) {
console.error("An error occurred:", e);
}
});
< /code>
Тогда у меня есть тесты (пост ответ), которые в основном представляют собой проверки формата JSON и выглядят так: < /p>
const spBase = pm.environment.get("sp_base");
const certJson = pm.environment.get("cert_json");
const signature = pm.environment.get("signature");
const spSigner = pm.environment.get("sp_signer");
//console.log("certJson is " + certJson);
pm.test("Cert and signature exist", function () {
pm.expect(certJson).to.be.a("string");
// Updated regex to ensure signature matches expected format
pm.expect(signature).to.match(/^0x[0-9a-fA-F]{130}$/);
});
const verifyReq = {
url: spBase + "/cert/verify",
method: "POST",
header: [{ key: "Content-Type", value: "application/json" }],
body: { mode: "raw", raw: JSON.stringify({ cert: JSON.parse(certJson), signature: signature, expectedSigner: spSigner})}
};
pm.sendRequest(verifyReq, function (err, resp) {
pm.test("Verify endpoint responded", function () {
pm.expect(err).to.be.null;
pm.expect(resp).to.have.property("code", 200);
});
const data = resp.json();
pm.test("Signature is valid", function () {
pm.expect(data.ok).to.eql(true);
pm.expect((data.recovered || "").toLowerCase()).to.eql((spSigner || "").toLowerCase());
});
});
< /code>
Пожалуйста, проверьте мой код PM.SendRequest на наличие потенциальных ошибок. Один из моих сообщений возвращает 400 ошибок от ответа на 400, так что это можно было запустить внутри Server.js, но я не уверен. Это пост, который, по -видимому, генерируется почтальником, а не моими сценариями. < /P>
В консоли появляются три сообщения. Я вижу вывод в консольном журнале, который выглядит действительным для двух из этих сообщений (CertJson), я проверил этот вывод JSonLint, и он хороший JSON, но он в журнале консоли! не тело сообщения. Как упомянуто выше второго поста в списке трех, содержит тело ответа с вышеуказанным HTML (код ошибки), и ни один JSON никогда не появляется в области тела почтальона. Мой тип контента установлен на Application.json, а URL SP_BASE правильно показывает адрес локального хоста. Я начну с трех переменных вручную, настроенной вручную, DLN, user_secret (который в конечном итоге станет большим прайм) и SP_BASE (LocalHost: 10533, согласно агенту почтальона). Затем Server.js создает больше учетных данных. Однако я пытаюсь решить эту ошибку вывода JSON, которая отказывается разбираться в теле сообщения. Любая помощь с благодарностью получена. Пожалуйста, ищите синтаксические ошибки в соответствии с сообщением об ошибке. Я использую Firefox в качестве браузера для почтовой сети.
Подробнее здесь: [url]https://stackoverflow.com/questions/79762956/unexpected-end-of-json-input-at-json-parse-api-error-with-postman-and-javascri[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия