#node.js #express #heroku #salesforce
#node.js #экспресс #heroku #salesforce
Вопрос:
Я создал приложение Heroku, чтобы иметь возможность извлекать записи (контракты) из Salesforce и отображать их в моем приложении Heroku. Но я изо всех сил пытаюсь написать правильный запрос на моем node.js код. По сути, при нажатии кнопки «Получить контракты» я хотел бы получить список контрактов, как показано на рисунке.
Но в моем случае я получаю сообщение об ошибке каждый раз, когда нажимаю «Извлечь контракты» {«ошибка»: «отношение «контракт» не существует»}
Для получения записей из Salesforce я использую «Express.js » и «app.get» (вот фрагмент).
app.get('/getContracts', function(req, res) {
pg.connect(process.env.DATABASE_URL, function (err, conn, done) {
// watch for any connect issues
if (err) {
console.log(err);
return;
}
conn.query('SELECT Name,Product__c FROM Contract WHERE Product__c != null',
function(err, result) {
console.log(result)
if (err) {
res.status(400).json({error: err.message});
}
else {
// Need to display 'Success!'
res.json(result);
}
});
});
});
вот полный код:
server.js:
var express = require('express');
var bodyParser = require('body-parser');
var pg = require('pg');
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.static('public'));
app.use(bodyParser.json());
app.post('/update', function(req, res) {
pg.connect(process.env.DATABASE_URL, function (err, conn, done) {
// watch for any connect issues
if (err) console.log(err);
conn.query(
'UPDATE salesforce.Contact SET Phone = $1, HomePhone = $1, MobilePhone = $1 WHERE LOWER(FirstName) = LOWER($2) AND LOWER(LastName) = LOWER($3) AND LOWER(Email) = LOWER($4)',
[req.body.phone.trim(), req.body.firstName.trim(), req.body.lastName.trim(), req.body.email.trim()],
function(err, result) {
if (err != null || result.rowCount == 0) {
conn.query('INSERT INTO salesforce.Contact (Phone, MobilePhone, FirstName, LastName, Email) VALUES ($1, $2, $3, $4, $5)',
[req.body.phone.trim(), req.body.phone.trim(), req.body.firstName.trim(), req.body.lastName.trim(), req.body.email.trim()],
function(err, result) {
done();
if (err) {
res.status(400).json({error: err.message});
}
else {
// this will still cause jquery to display 'Record updated!'
// eventhough it was inserted
res.json(result);
}
});
}
else {
done();
res.json(result);
}
}
);
});
});
app.get('/getContracts', function(req, res) {
pg.connect(process.env.DATABASE_URL, function (err, conn, done) {
// watch for any connect issues
if (err) {
console.log(err);
return;
}
conn.query('SELECT Name,Product__c FROM Contract WHERE Product__c != null',
function(err, result) {
console.log(result)
if (err) {
res.status(400).json({error: err.message});
}
else {
// Need to display 'Success!'
res.json(result);
}
});
});
});
app.listen(app.get('port'), function () {
console.log('Express server listening on port ' app.get('port'));
});
индексировать html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CRM AXG</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<style>
body {
padding-top: 60px;
}
</style>
<script>
$(function() {
$("#phoneChangerForm").submit(function(event) {
event.preventDefault();
var errorMessage = $("#errorMessage");
var error = $("#error");
error.hide();
$("#message").hide();
var firstName = $("#firstName").val();
var lastName = $("#lastName").val();
var email = $("#email").val();
var phone = $("#phone").val();
if (firstName.length == 0 || lastName.length == 0 || email.length == 0 || phone.length == 0) {
errorMessage.text("All of the fields are required.");
error.show();
}
else {
$.ajax({
url: event.target.action,
method: event.target.method,
data: JSON.stringify({
firstName: firstName,
lastName: lastName,
email: email,
phone: phone
}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
$("#firstName").val("");
$("#lastName").val("");
$("#email").val("");
$("#phone").val("");
$("#messageMessage").text("Record updated!");
$("#message").show();
},
error: function(err) {
errorMessage.text(err.responseJSON.error);
error.show();
}
})
}
});
});
</script>
<script>
$(function() {
$("#getContractForm").submit(function(event) {
event.preventDefault();
var errorMessage = $("#errorMessage");
var error = $("#error");
error.hide();
$("#message").hide();
$.ajax({
url: event.target.action,
method: event.target.method,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
console.log(data);
$("#name").val("");
$("#product__c").val("");
$("#messageMessage").text("Success!");
$("#message").show();
},
error: function(err) {
errorMessage.text(err.responseJSON.error);
error.show();
}
})
});
});
</script>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">Contact Information</a>
</div>
</div>
</nav>
<div class="container">
<form id="phoneChangerForm" action="/update" method="post" style="width: 400px">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Contact Information</h3>
</div>
<div class="panel-body">
<div class="form-group">
<label for="firstName">First Name</label>
<input type="text" class="form-control" id="firstName" placeholder="For verification" required>
</div>
<div class="form-group">
<label for="lastName">Last Name</label>
<input type="text" class="form-control" id="lastName" placeholder="For verification" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" id="email" placeholder="For verification" required>
</div>
<div class="form-group">
<label for="phone">Phone</label>
<input type="tel" class="form-control" id="phone" placeholder="New Phone Number" required>
</div>
</div>
<div class="panel-footer">
<div id="message" class="alert alert-info" role="alert" style="display: none;">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<span id="messageMessage"></span>
</div>
<div id="error" class="alert alert-danger" role="alert" style="display: none;">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
<span id="errorMessage"></span>
</div>
<button type="submit" class="btn btn-primary">Update Contact</button>
</div>
</div>
</form>
</div>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">Contract Information</a>
</div>
</div>
</nav>
<div class="container">
<form id="getContractForm" action="/getContracts" method="get" style="width: 400px">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Contract List</h3>
</div>
<div class="panel-body">
</div>
<div class="panel-footer">
<div id="message" class="alert alert-info" role="alert" style="display: none;">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<span id="messageMessage"></span>
</div>
<!-- display retrieve contracts result-->
<Table>
<tbody>
<!-- <jS>data.foreach(d) => <tr>d.name</tr></jS> -->
</tbody>
</Table>
<div id="error" class="alert alert-danger" role="alert" style="display: none;">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
<span id="errorMessage"></span>
</div>
<button type="submit" class="btn btn-primary">Retrieve Contracts</button>
</div>
</div>
</form>
</div>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">CRM AXG</a>
</div>
</div>
</nav>
<div class="container">
<form id="getContractForm" action="/" method="get" style="width: 400px">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Product List</h3>
</div>
<div class="panel-body">
<div class="form-group">
<label for="contractName">Product Name</label>
<input type="text" class="form-control" id="contractName" placeholder="For verification" required>
</div>
</div>
<div class="panel-footer">
<div id="message" class="alert alert-info" role="alert" style="display: none;">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<span id="messageMessage"></span>
</div>
<div id="error" class="alert alert-danger" role="alert" style="display: none;">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
<span class="sr-only">Error:</span>
<span id="errorMessage"></span>
</div>
<button type="submit" class="btn btn-primary">Retrieve Products</button>
</div>
</div>
</form>
</div>
</body>
</html>
Ответ №1:
Мне удалось решить проблему. Мне нужно было обновить свой запрос SOQL:
conn.query('SELECT Name,Product__c FROM salesforce.Contract WHERE Product__c != null'